C# 如何处理空套接字缓冲区

C# 如何处理空套接字缓冲区,c#,.net,sockets,exception-handling,network-programming,C#,.net,Sockets,Exception Handling,Network Programming,我正在编写一个套接字服务器,我注意到如果它收到一个空的套接字缓冲区,它将导致一个socketexception。在receive调用中,如何检测和处理空缓冲区,并在套接字关闭之前向客户端发送-1响应 代码: 适当使用DataAvailable子句。 我建议您编写完整的类和助手方法来完成所有这些常规操作。 sleep(1000)是不必要的,因为监听器将等待您的命令行被执行。 另一种方法是使用开发的套接字库,您可以轻松地模拟服务器和客户端角色。我知道使用supersocket可以自定义和开发您自己的

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

代码:


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

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

假设您使用的是TCP层

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

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

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


客户端也将收到异常,该异常将包含关于连接丢失的错误消息。

假设您正在使用TCP层

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

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

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


客户端也将收到异常,该异常将包含关于连接丢失的错误消息。

不清楚您的意思。我只希望
Receive
在另一端关闭套接字时返回0。你所说的“如果它收到一个空的套接字缓冲区”到底是什么意思?不清楚你的意思。我只希望
Receive
在另一端关闭套接字时返回0。你所说的“如果它收到一个空的套接字缓冲区”到底是什么意思?
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
}