如何检测另一方在TCP套接字上调用了shutdown()?

时间:2013-02-08 18:40:45

标签: c windows sockets tcp winsock

比如说,tcp客户端连接到socket上的tcp服务器。接下来,客户端调用shutdown(s);然后服务器应该如何检测客户端是否已执行该操作?

PS:我知道服务器将收到FD_CLOSE。但是,我不知道如何在服务器端检查该标志。

2 个答案:

答案 0 :(得分:4)

来自winsock的recv描述:

  

如果连接已正常关闭,则返回值为零。

recvWSARecv(或ReadFile)获取零字节数是了解对方已关闭连接的常用方法。

答案 1 :(得分:1)

xmllmx - 不要调用recv()来检查套接字是否已关闭,使用select()并询问套接字何时可读或可写。另请注意,除非您只是为类编写演示,否则您最有可能希望将套接字设置为非阻塞模式,因为调用带有太大缓冲区的recv()会导致它被阻塞,因此会导致send()使用缓冲区无法容纳OS的缓冲区等...

最后,在Winsock中使用select()非常糟糕;您可能希望使用其中一种形式的重叠I / O,例如完成例程或完成端口。