我应该如何检查一个(TCP)套接字以确定它是否已连接?
我已经阅读了MSDN中关于Socket.Connected
属性的内容,但它仅显示最后一次I/O的状态。这对我来说没有用,因为我想在尝试从套接字中读取数据之前进行检查。备注部分还指出:
如果您需要确定当前连接的状态,请进行非阻塞的零字节Send调用。如果调用成功返回或引发WAEWOULDBLOCK错误代码(10035),则套接字仍处于连接状态;否则,套接字不再连接。
同一页上的示例展示了如何实现。(1) 但是Ian Griffiths的一篇文章说我应该从套接字中读取,而不是通过套接字发送。
在调用Shutdown()
之后,调用Receive()
直到它返回0
(假设远程端点不会实际发送任何内容,这将在远程端点接收到您的所有数据后发生)。除非您这样做,否则无法保证远程端点实际上已经接收到您发送的所有数据,即使使用了延迟套接字也是如此。我真的不理解他关于调用
Receive()
以确保远程端点实际上已经接收到我发送的所有数据的声明。(套接字是否阻塞接收直到发送缓冲区为空?)我对提出的不同方法感到困惑。你能解释一下吗?
(1) 我想知道为什么关于 Socket.Connected
属性的 example 分配了一个1字节的数组,即使它调用了长度为0的 Send
方法?