C# ReceiveAsync 错误

6

我目前正在开发一个应用服务器。我想使用AcceptAsync方法。但是在调用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)
    {

    }
}

我假设如果您在那一行设置断点,那么clientSocket(因此e.AcceptSocket)将为null? e.SocketError返回什么? - Rich
我能够复现这个问题,而且clientSocket不是null,但是我无法弄清楚。 - svick
2个回答

7

我曾经遇到过同样的问题,最终找到了解决方法。 在调用ReceiveAsync(e)之前,你需要为SocketAsyncEventArgs对象提供一个数据缓冲区(字节数组)来存储接收到的数据。

void e_Completed(object sender, SocketAsyncEventArgs e)
{
    byte[] buffer = new byte[1024];
    e.SetBuffer(buffer, 0, buffer.Length);
    AcceptCallback(e);
}

-1
我不确定为什么你在两个地方接受 socket。如果你删除


 AcceptCallback(e);

从 e_Completed 开始一切都正常工作。

这是一个示例异步服务器的链接:

一个链接


1
盲目地不断尝试直到程序正常运行并不是一种好的软件开发方法。最好的方式是尝试理解错误的原因并进行修复。在这里,代码试图从异步套接字中接收数据,但没有先分配和指定一个接收缓冲区。这就是需要修复的问题。 - Indy9000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接