1

我正在编写一个套接字服务器,我注意到如果它收到一个空的套接字缓冲区,它将导致套接字异常。在接收调用中,如何检测和处理空缓冲区并在套接字关闭之前将 -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
}
4

2 回答 2

1

假设您正在使用 TCP 层。

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

这就是为什么只有在上一个可能失败或在上一个和当前呼叫网络之间出现一些错误(例如连接丢失)时,您才会在下一次呼叫时收到 SocketException。

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

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

于 2012-04-23T14:41:11.470 回答
0

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

于 2012-04-23T14:39:46.770 回答