异步套接字侦听器发送数据错误

本文关键字:数据 错误 套接字 侦听器 异步 | 更新日期: 2023-09-27 17:56:24

我正在围绕Socket类创建一个包装类。

我有一个连接异步回调,它这样做:

public void StartConnecting()
{
    // Connect to a remote device.
    try
    {
        //_acceptIncomingData = acceptIncomingData;
        // Create a TCP/IP socket.
        _workingSocket = new Socket(AddressFamily.InterNetwork,
                SocketType.Stream, ProtocolType.Tcp);
        if (Information != null)
            Information(this, new InfoEventArgs("Connecting", "Working socket is initiating connection"));
        // Connect to the remote endpoint.
        _workingSocket.BeginConnect(_localEndPoint,
                new AsyncCallback(ConnectCallback), _workingSocket);
    }
    catch (Exception ex)
    {
        if (Error != null)
            Error(this, new ErrorEventArgs(ex.Message, ex));
    }
}
private void ConnectCallback(IAsyncResult ar)
{
    try
    {
        // Retrieve the socket from the state object.
        Socket client = (Socket)ar.AsyncState;
        // Complete the connection.
        client.EndConnect(ar);
        // ACTION CONNECTED COMPLETE
        if (Information != null)
            Information(this, new InfoEventArgs("Connected", "Working socket has now connected"));
        // Start Receiving on the socket
        // Create the state object.
        StateObject state = new StateObject();
        state.workSocket = client;
        // Begin receiving the data from the remote device.
        client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                new AsyncCallback(ReceiveCallback), state);
    }
    catch (Exception ex)
    {
        if (Error != null)
            Error(this, new ErrorEventArgs(ex.Message, ex));
    }
}

对于状态对象,它使用一个预定义的类:

public class StateObject
{
    // Client  socket.
    public Socket workSocket = null;
    // Size of receive buffer.
    public const int BufferSize = 1024;
    // Receive buffer.
    public byte[] buffer = new byte[BufferSize];
    // Received data string.
    public StringBuilder sb = new StringBuilder();
}

使用它连接到已经开始侦听的套接字,我称这个侦听套接字为Server,它使用 Socket 类。上面的代码是一个我称之为Client的套接字。当Client连接Server时,Client现在被允许向Server发送数据。但是,当我想接收从Server发送的数据时,我收到以下错误消息:

不允许

发送或接收数据的请求,因为套接字是 未连接和(使用 sendto 在数据报套接字上发送时 呼叫)未提供地址。

我错过了什么?还是做得不好?

在系统提示检查Server是否正在侦听后,我查看了包装类中我所说的WorkingSocket,即正在使用的套接字,在成功Server侦听/Client连接协商后,我检查了这个。它确实说插座未连接。所以我现在的问题是:

是否需要将Server(侦听套接字)连接到Client才能发送数据,如果您有一个Server用于多个Client,您如何做到这一点?

异步套接字侦听器发送数据错误

我在

一月份对套接字的工作原理有误解。导致此错误是因为我不明白当客户端连接到侦听套接字时,侦听套接字会创建一个新的套接字对象,从客户端发送和接收的所有数据都将链接回该对象。

在上面的示例中,我应该创建并存储一个新的套接字供客户端操作,并使用它来发送和接收数据。