Невозможен повторный коннект - 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);

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


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

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

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