Исправление одного подключения (асинхронный сокет) - C#

Узнай цену своей работы

Формулировка задачи:

Пишу асинхронный сокет. У меня существует 2 ошибки: 1) Когда я подключился клиентом к серверу и отправил сообщение он принял в ответку, потом завершился. Но при повторном подключении к серверу, он не коннектиться. 2) Когда сервер ожидает минут 2-3 вылетает ошибка на этой строке "this.socket.BeginAccept(new AsyncCallback(AcceptCallBack), this.socket);"; Кто поможет буду очень благодарен. Это идёт для курсача, сроки уже поджимают. Буду очень благодарен кто поможет исправить эти ошибки. Клиент:
namespace client
{
    class Program
    {
        static void Main(string[] args)
        {
            client Client = new client("192.168.232.1", 2200);
            Client.Connect();
            Client.Send();
            System.Threading.Thread.Sleep(2000);
            Client.Disconnect();        //отключение от сервера
            Console.Read();
        }
    }
}namespace client
{
    class StateObject
    {
        public Socket workSocket = null;            //сокет клиента
        public const int bufferSize = 1024;         //max размер буфера
        public byte[] buffer = new byte[bufferSize];//буфер
        public StringBuilder sb = new StringBuilder();//принятные данные в виде строки
    }
 
    class client
    {
        private Socket socket_client;
        private IPEndPoint ip;
        private ManualResetEvent acceptEvent = new ManualResetEvent(false);
 
        //создание сокета
        public client(string ip, int port)
        {
            this.ip = new IPEndPoint(IPAddress.Parse(ip), port);
            this.socket_client = new Socket(this.ip.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
 
        }
 
        //подключение к серверу
        public void Connect()
        {
            this.socket_client.BeginConnect(this.ip, new AsyncCallback(ConnectCallBack), this.socket_client);
        }
 
        //метод для завершения операции
        private void ConnectCallBack(IAsyncResult ar)
        {
            Socket handle = (Socket)ar.AsyncState;
            this.socket_client.EndConnect(ar);
        }
 
        //отключение от сервера
        public void Disconnect()
        {
            this.socket_client.BeginDisconnect(false, new AsyncCallback(DisconnectCallBack), this.socket_client);
        }
 
        private void DisconnectCallBack(IAsyncResult ar)
        {
            Socket handle = ar.AsyncState as Socket;
            handle.EndDisconnect(ar);
            Console.WriteLine("Connect close.");
        }
 
        //отправка сообщения
        public void Send()
        {
            string message = Console.ReadLine();
            byte[] buffer = Encoding.UTF8.GetBytes(message);
            this.socket_client.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(SendCallBack), this.socket_client); 
        }
 
        private void SendCallBack(IAsyncResult ar)
        {
            Socket handle = ar.AsyncState as Socket;
            handle.EndSend(ar);
            Receive();
        }
 
        //принятие данных
        public void Receive()
        {
            StateObject state = new StateObject();
            state.workSocket = this.socket_client;
            state.workSocket.BeginReceive(state.buffer, 0, StateObject.bufferSize, SocketFlags.None, new AsyncCallback(ReceiveCallBack), state);
        }
 
        private void ReceiveCallBack(IAsyncResult ar)
        {
            try
            {
                StateObject state = ar.AsyncState as StateObject;
                Socket handl = state.workSocket;
                if (handl.Connected)
                {
                    int bytes = handl.EndReceive(ar);
                    if (bytes > 0)
                    {
                        string cmd = Encoding.UTF8.GetString(state.buffer, 0, bytes);
                        Console.WriteLine("Server: " + cmd);
                    }
                }
            }
            catch (Exception) { Console.WriteLine("Error"); }
        }
    }
}
Сервер:
namespace server
{
    class Program
    {
        static void Main(string[] args)
        {
            server Server = new server("192.168.232.1", 2200);
            Server.Init();
        }
    }
}namespace server
{
    class server
    {
        private Socket socket;
        private IPEndPoint ip;
        private ManualResetEvent acceptEvent = new ManualResetEvent(false);
 
        //создание сокета
        public server(string ip, int port)
        {
            this.ip = new IPEndPoint(IPAddress.Parse(ip), port);
            this.socket = new Socket(this.ip.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
 
        }
 
        //ставим сокет в режиме прослушивания
        public void Init()
        {
            this.socket.Bind(this.ip);
            this.socket.Listen((int)SocketOptionName.MaxConnections);
            StartListening();
        }
 
        //ждём подключения клиентов
        private void StartListening()
        {
            Console.WriteLine("Server start...");
            while (true)
            {
                this.socket.BeginAccept(new AsyncCallback(AcceptCallBack), this.socket);
            }
        }
 
        //обработка подключившигося клиента
        private void AcceptCallBack(IAsyncResult ar)
        {
            Socket socket = (Socket)ar.AsyncState;
            Socket accept_socket = socket.EndAccept(ar);
            ServerHandle handle = new ServerHandle(accept_socket);
            handle.Start();
            acceptEvent.Set();
            Console.WriteLine("New connection.");
        }
    }
}namespace server
{
    class StateObject
    {
        public Socket workSocket = null;            //сокет клиента
        public const int bufferSize = 1024;         //max размер буфера
        public byte[] buffer = new byte[bufferSize];//буфер
        public StringBuilder sb = new StringBuilder();//принятные данные в виде строки
    }
 
    class ServerHandle
    {
        private Socket client_socket;
 
        public ServerHandle(Socket client_socket)
        {
            this.client_socket = client_socket;
        }
 
        public void Start()
        {
            Receive();
        }
 
        //инициализируем класс и вызываем принятие данных
        public void Receive()
        {
            StateObject state = new StateObject();
            state.workSocket = this.client_socket;
            state.workSocket.BeginReceive(state.buffer, 0, StateObject.bufferSize, SocketFlags.None, new AsyncCallback(ReceiveCallBack), state);
        }
 
        private void ReceiveCallBack(IAsyncResult ar)
        {
            try
            {
                StateObject state = ar.AsyncState as StateObject;
                Socket handler = state.workSocket;
                if(handler.Connected)
                {
                    int bytes = handler.EndReceive(ar);
                    if (bytes > 0)
                    {
                        state.sb.Append(Encoding.UTF8.GetString(state.buffer, 0, bytes));
                        Console.WriteLine("Receive: " + state.sb);
                        Send();
                    }
                }
 
            }
            catch (Exception) { Console.WriteLine("Error Receive"); }
        }
 
        private void Send()
        {
            Socket socket = this.client_socket;
            //string message = Console.ReadLine();
            byte[] buffer = Encoding.UTF8.GetBytes("Hello");
                socket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(SendCallBack), socket);
        }
 
        private void SendCallBack(IAsyncResult ar)
        {
            Socket handle = ar.AsyncState as Socket;
            handle.EndSend(ar);
            Receive();
        }
    }
}
pack.rar

Решение задачи: «Исправление одного подключения (асинхронный сокет)»

textual
Листинг программы
//ждём подключения клиентов
        private void StartListening()
        {
            Console.WriteLine("Server start...");
            while (true)
            {
                acceptEvent.Reset();
                this.socket.BeginAccept(new AsyncCallback(AcceptCallBack), this.socket);
                acceptEvent.WaitOne();
            }
        }
 
        //обработка подключившигося клиента
        private void AcceptCallBack(IAsyncResult ar)
        {
            Socket socket = (Socket)ar.AsyncState;
            Socket accept_socket = socket.EndAccept(ar);
            acceptEvent.Set();
            ServerHandle handle = new ServerHandle(accept_socket);
            handle.Start();
            Console.WriteLine("New connection.");
            socket.BeginAccept(new AsyncCallback(AcceptCallBack), this.socket);
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4 из 5
Похожие ответы