如何处理空套接字缓冲区

时间:2012-04-23 14:18:02

标签: c# .net sockets exception-handling network-programming

我正在编写一个套接字服务器,我注意到如果它收到一个空的套接字缓冲区,它将导致一个socketexception。在接收调用中,如何在套接字关闭之前检测并处理空缓冲区并将-1响应发送回客户端?

代码:

try
{
    byte[] byteBuffer = new Byte[1024];
    int size = m_clientSocket.Receive(byteBuffer);
    if (size > 0)
    {
        ParseReceiveBuffer(byteBuffer, size);
    }
    else
    {
        m_clientSocket.Send(BitConverter.GetBytes(-1));
    }
}
catch (SocketException ex)
{
    if (ex.SocketErrorCode == SocketError.WouldBlock ||
        ex.SocketErrorCode == SocketError.IOPending ||
        ex.SocketErrorCode == SocketError.NoBufferSpaceAvailable)
    {
        // socket buffer is probably empty, wait and try again
        Thread.Sleep(1000);
    }
    // connection was unexpectively closed
}

2 个答案:

答案 0 :(得分:1)

假设您正在使用TCP层。

发送和接收等套接字功能实际上并不是通过网络发送或接收数据。它们与OS套接字层通信以从网络层推送或弹出数据。 因此,当您从应用程序方法Send中运行时,它会将队列数据放入OS网络层。只有在那个操作系统实际发送它之后才会出现问题,这样它就会存储错误,并且会在你的应用程序的特定套接字方法调用之后直接抛出它。

这就是为什么你只能在下次调用时收到SocketException,因为之前可能会失败,或者在之前和当前的调用网络之间有一些错误(例如连接丢失)。

当收到异常时,您将始终不会收到任何内容(零字节)。 由于连接丢失(在大多数情况下(99%)),您无法在异常后发送任何内容。

客户端也将收到有关连接丢失的错误消息的异常。

答案 1 :(得分:0)

在适当的使用中使用DataAvailable子句。 我建议您编写完整的类和辅助方法来完成所有这些常规操作。 并且thread.sleep(1000)不是必需的,因为侦听器将等待您的命令行被执行。 另一种方法是使用开发的套接字库,您可以轻松地模拟服务器和客户端角色。我知道超级套件,您可以自定义和开发自己的协议。