由于套接字未连接,不允许发送或接收数据的请求

本文关键字:数据 请求 套接字 连接 不允许 | 更新日期: 2023-09-27 18:06:27

经过长时间的休息,我试图刷新我的System.Net.Sockets的记忆,但我遇到的问题只是连接甚至2台机器。

异常:发送或接收数据的请求被拒绝,因为套接字未连接并且(当使用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);
        }

由于套接字未连接,不允许发送或接收数据的请求

错误是由于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);