Невозможен повторный коннект - C#
Формулировка задачи:
Пытаюсь написать клиент серверное приложение. При первом подключении клиента к серверу подключение происходит нормально, отключение тоже, однако при попытке повторного подключения вылазиет ошибка :Обычно разрешается только одно использование адреса сокета. В чем проблема? Вот код
Клиент:
Сервер:
private void ConnectButton_Click(object sender, EventArgs e) { if (AllRight) try { ConnectButton.Enabled = false; IPAddress IP = new IPAddress(new byte[] { Convert.ToByte(IP1textBox.Text), Convert.ToByte(IP2textBox.Text), Convert.ToByte(IP3textBox.Text), Convert.ToByte(IP4textBox.Text) }); IPEndPoint ServerSocket = new IPEndPoint(IP, Convert.ToInt32(PorttextBox.Text)); if(Server==null) Server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); Server.BeginConnect(ServerSocket, new AsyncCallback(ConnectCallback), Server); Statuslabel.Text = "Подключение..."; } catch { ConnectButton.Enabled = true; Statuslabel.Text = "Не подключен"; } } private void ConnectCallback(IAsyncResult ar) { try { Socket Serv = (Socket)ar.AsyncState; Serv.EndConnect(ar); //Вот здесь вылазиет ошибка Statuslabel.Invoke(new Action(()=> Statuslabel.Text = "Подключено")); DisconnectButton.Invoke(new Action(() => DisconnectButton.Enabled = true)); } catch { Statuslabel.Invoke(new Action(() => Statuslabel.Text = "Не подключено")); ConnectButton.Invoke(new Action(() => ConnectButton.Enabled = true)); } } private void DisconnectButton_Click(object sender, EventArgs e) { Statuslabel.Invoke(new Action(() => Statuslabel.Text = "Отключение...")); Server.BeginDisconnect(false, new AsyncCallback(DisconnectCallback), Server); } private void DisconnectCallback(IAsyncResult ar) { Socket Serv = (Socket)ar.AsyncState; Serv.EndDisconnect(ar); ConnectButton.Invoke(new Action(() => ConnectButton.Enabled = true)); DisconnectButton.Invoke(new Action(() => DisconnectButton.Enabled = false)); Statuslabel.Invoke(new Action(() => Statuslabel.Text = "Не подключено")); } private void SendData() { if (Server == null) return; if (Server.Connected) { string data = string.Format("{0};{1};{2};{3};{4}", XtrackBar.Value, YtrackBar.Value, ZtrackBar.Value, PT, PJT); byte[] Buffer = Encoding.ASCII.GetBytes(data); Server.BeginSend(Buffer, 0, Buffer.Length, 0, new AsyncCallback(SendCallback), Server); } }
private void ServerWork() { while (true) { ConnectClientDone.Reset(); Listener.BeginAccept(new AsyncCallback(AcceptCallback), Listener); ConnectClientDone.WaitOne(); } } private void StartServerbutton_Click(object sender, EventArgs e) { if(PorttextBox.Text== string.Empty) { ServererrorProvider.SetError(PorttextBox,"Отсутствует значение"); return; } Statuslabel.Invoke(new Action(() => Statuslabel.Text = "Запуск сервера")); int Port; int.TryParse(PorttextBox.Text, out Port); IPHostEntry HostEntry = Dns.Resolve(Dns.GetHostName()); IPAddress IpAddres = HostEntry.AddressList[0]; IPEndPoint LocalPoint = new IPEndPoint(IpAddres, Port); Listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { Listener.Bind(LocalPoint); Listener.Listen(10); Statuslabel.Invoke(new Action(() => Statuslabel.Text = "Ожидание подключений")); StopServerbutton.Invoke(new Action(() => StopServerbutton.Enabled = true)); StartServerbutton.Invoke(new Action(() => StartServerbutton.Enabled = false)); Thread Work = new Thread(ServerWork); Work.IsBackground = true; Work.Start(); } catch (Exception ex) { Statuslabel.Invoke(new Action(() => Statuslabel.Text = "Не работает")); StopServerbutton.Invoke(new Action(() => StopServerbutton.Enabled = false)); StartServerbutton.Invoke(new Action(() => StartServerbutton.Enabled = true)); } } private void AcceptCallback(IAsyncResult ar) { ConnectClientDone.Set(); Socket listener = (Socket)ar.AsyncState; Socket handler = listener.EndAccept(ar); CountClient += 1; ClientCountlabel.Invoke(new Action(() => ClientCountlabel.Text = CountClient.ToString())); Thread RecieveClientWork = new Thread(new ParameterizedThreadStart(RecieveClient)); RecieveClientWork.IsBackground = true; RecieveClientWork.Start(handler); } private void RecieveClient(object socket) { Socket Client = (Socket)socket; while (Client.Connected) { RecieveClientDone.Reset(); Client.BeginReceive(Buffer, 0, BufferSize, 0, new AsyncCallback(RecieveClientCallback), Client); RecieveClientDone.WaitOne(); } } private void RecieveClientCallback(IAsyncResult ar) { Socket Client = (Socket)ar.AsyncState; int BytesRead = Client.EndReceive(ar); if (BytesRead == 0) { Client.BeginDisconnect(false, new AsyncCallback(ClientDisconnect), Client); } else { Server.BeginSend(Buffer, 0, BytesRead, 0, new AsyncCallback(SendServerCallback), Server); ClearBuffer(); RecieveClientDone.Set(); } } private void ClientDisconnect(IAsyncResult ar) { Socket Client = (Socket)ar.AsyncState; Client.EndDisconnect(ar); Client.Close(); CountClient -= 1; ClientCountlabel.Invoke(new Action<int>((count) => ClientCountlabel.Text = count.ToString()), CountClient); }
Через некоторое время подключение однако возможно снова.
Решение задачи: «Невозможен повторный коннект»
textual
Листинг программы
Server.BeginDisconnect(false, new AsyncCallback(DisconnectCallback), Server);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д