C#接收异步错误

C#接收异步错误,c#,C#,我正在开发一个应用服务器。我想使用同步方法。调用ReceiveAsync方法时出现错误“对象引用未设置为对象的实例”。如果有人提出这个问题并找到了解决办法 public class AppServer { public void Start() { Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); se

我正在开发一个应用服务器。我想使用同步方法。调用ReceiveAsync方法时出现错误“对象引用未设置为对象的实例”。如果有人提出这个问题并找到了解决办法

public class AppServer
{
    public void Start()
    {
        Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        serverSocket.Bind(new IPEndPoint(IPAddress.Any, 12345));
        serverSocket.Listen(100);

        SocketAsyncEventArgs e = new SocketAsyncEventArgs();
        e.Completed += new EventHandler<SocketAsyncEventArgs>(e_Completed);

        bool raiseEvent = serverSocket.AcceptAsync(e);
        if (!raiseEvent)
            AcceptCallback(e);
    }

    void e_Completed(object sender, SocketAsyncEventArgs e)
    {
        AcceptCallback(e);
    }

    private void AcceptCallback(SocketAsyncEventArgs e)
    {
        SocketAsyncEventArgs readEventArgs = new SocketAsyncEventArgs();
        readEventArgs.Completed += new EventHandler<SocketAsyncEventArgs>(readEventArgs_Completed);

        Socket clientSocket = e.AcceptSocket;
        bool raiseEvent = clientSocket.ReceiveAsync(readEventArgs); // <-- Error goes here
        if (!raiseEvent)
            ReceiveCallback(readEventArgs);
    }

    void readEventArgs_Completed(object sender, SocketAsyncEventArgs e)
    {
        ReceiveCallback(e);
    }

    private void ReceiveCallback(SocketAsyncEventArgs e)
    {

    }
}
公共类AppServer
{
公开作废开始()
{
Socket serverSocket=新套接字(AddressFamily.InterNetwork、SocketType.Stream、ProtocolType.Tcp);
Bind(新的IPEndPoint(IPAddress.Any,12345));
serverSocket.Listen(100);
SocketAsyncEventArgs e=新的SocketAsyncEventArgs();
e、 已完成+=新事件处理程序(e_已完成);
bool raiseEvent=serverSocket.acceptsync(e);
如果(!raiseEvent)
接受(e);
}
无效e_已完成(对象发送方,SocketAsyncEventArgs e)
{
接受(e);
}
私有void AcceptCallback(SocketAsyncEventArgs e)
{
SocketAsyncEventArgs readEventArgs=新的SocketAsyncEventArgs();
readEventArgs.Completed+=新的事件处理程序(readEventArgs\u Completed);
Socket clientSocket=e.AcceptSocket;

bool raiseEvent=clientSocket.ReceiveAsync(readEventArgs);//我不确定为什么要在两个位置接受套接字。如果删除

 AcceptCallback(e);
从e_完成,一切正常

它是指向示例异步服务器的链接:


我也有同样的问题,我设法解决了。 在调用ReceiveAsync(e)之前,您需要为SocketAsyncEventArgs对象提供一个数据缓冲区(字节数组)来存储接收到的数据


我假设,如果在该行上放置断点,那么clientSocket(以及e.AcceptSocket)是空的吗?e.SocketError返回什么?我能够重现问题,并且
clientSocket
不是
null
,我无法找出它。盲目地把东西拉出来,直到它工作为止,对于软件来说不是一个好方法。如果您尝试理解错误的原因并修复它,这将是一个好方法。在这里,代码正在尝试接收错误来自异步套接字的数据,无需首先分配和分配接收缓冲区。这是应该解决的问题。
void e_Completed(object sender, SocketAsyncEventArgs e)
{
    byte[] buffer = new byte[1024];
    e.SetBuffer(buffer, 0, buffer.Length);
    AcceptCallback(e);
}