Исправление одного подключения (асинхронный сокет) - C#
Формулировка задачи:
Пишу асинхронный сокет. У меня существует 2 ошибки:
1) Когда я подключился клиентом к серверу и отправил сообщение он принял в ответку, потом завершился. Но при повторном подключении к серверу, он не коннектиться.
2) Когда сервер ожидает минут 2-3 вылетает ошибка на этой строке "this.socket.BeginAccept(new AsyncCallback(AcceptCallBack), this.socket);";
Кто поможет буду очень благодарен. Это идёт для курсача, сроки уже поджимают. Буду очень благодарен кто поможет исправить эти ошибки.
Клиент:
Сервер:
pack.rar
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(); } } }
Решение задачи: «Исправление одного подключения (асинхронный сокет)»
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); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д