Запрос на отправку или получение данных был отклонен, поскольку сокет не подключен. , - PullRequest
3 голосов
/ 21 августа 2011

После долгого перерыва я попытался обновить память System.Net.Sockets, но у меня возникли проблемы с подключением даже двух компьютеров.

Исключение: запрос на отправку или получение данных был отклонен, посколькусокет не подключен и (при отправке на дейтаграмму сокета с помощью вызова sendto) адрес не указывался

Код сервера:

private void startButton_Click(object sender, EventArgs e)
        {
            LocalEndpoint = new IPEndPoint(IPAddress.Parse("192.168.1.103"), 4444);
            _Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            _Socket.Bind(LocalEndpoint);
            _Socket.Listen(10);
            _Socket.BeginAccept(new AsyncCallback(Accept), _Socket);
        }

private void Accept(IAsyncResult _IAsyncResult)
        {
            Socket AsyncSocket = (Socket)_IAsyncResult.AsyncState;
            AsyncSocket.EndAccept(_IAsyncResult);

            buffer = new byte[1024];

            AsyncSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(Receive), AsyncSocket);
        }

        private void Receive(IAsyncResult _IAsyncResult)
        {
            Socket AsyncSocket = (Socket)_IAsyncResult.AsyncState;
            AsyncSocket.EndReceive(_IAsyncResult);

            strReceive = Encoding.ASCII.GetString(buffer);

            Update_Textbox(strReceive);

            buffer = new byte[1024];

            AsyncSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(Receive), AsyncSocket);
        }

Код клиента:

 private void connectButton_Click(object sender, EventArgs e)
        {
            RemoteEndPoint = new IPEndPoint(IPAddress.Parse("192.168.1.103"), 4444);
            _Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            _Socket.BeginConnect(RemoteEndPoint, new AsyncCallback(Connect), _Socket);
        }

 private void Connect(IAsyncResult _IAsyncResult)
        {
            Socket RemoteSocket = (Socket)_IAsyncResult.AsyncState;
            RemoteSocket.EndConnect(_IAsyncResult);
        }

1 Ответ

5 голосов
/ 10 ноября 2011

Ошибка вызвана следующей строкой в ​​вашей функции Accept:

AsyncSocket.EndAccept(_IAsyncResult);

Сервер прослушивает определенный сокет и использует его для приема соединений от клиента.Вы не можете использовать один и тот же сокет для приема соединений и получения данных от клиента.Если вы посмотрите на справку Socket.EndAccept, там написано, что он создает новый сокет для обработки связи с удаленным хостом.В вашем коде вы используете _Socket для прослушивания клиентских подключений и получения данных.Вы можете изменить эту строку следующим образом:

Socket dataSocket = AsyncSocket.EndAccept(_IAsyncResult);

Вам также необходимо передать этот новый сокет параметру функции BeginReceive в виде:

AsyncSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(Receive), dataSocket);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...