【问题标题】:C Sockets: Avoiding garbage when socket is closedC Sockets:套接字关闭时避免垃圾
【发布时间】:2011-05-09 13:05:50
【问题描述】:

我正在使用非阻塞套接字(fd_setsselect 函数)对服务器和客户端进行编程,一旦服务器关闭或关闭客户端套接字,客户端就会开始接收大量垃圾,直到它崩溃。 . 有人警告我,在使用select() 时,连接终止时套接字将变得可读,但我怎么知道

if( FD_ISSET( socket, &read ) ) 
{
} 

如果只是正常数据还是连接已经结束?

非常感谢!

【问题讨论】:

    标签: c sockets networking select winsock2


    【解决方案1】:

    文件描述符集不会告诉你套接字是否关闭,只是你可能会尝试从中读取。当远程端关闭连接时,套接字将变为“可读”。当您尝试recv() 时,返回值将为 0,表示套接字已关闭。始终检查您的返回值。

    【讨论】:

    • 谢谢!那么,当套接字关闭时,recv() 返回 0?哈哈,这很明显.. 非常感谢
    • @Lucas 你好!欢迎来到 Stackoverflow。如果您对 Dave 的回答感到满意,我们鼓励您接受它,并且可能会支持它。干杯!
    • 谢谢!我已经注册,一旦获得一些代表点,我就可以对答案进行投票
    【解决方案2】:

    您将不得不改用poll(它也更灵活,因为它不受 FD_SET 的大小限制!)

    struct poll p = {.fd = fd, .events = POLLHUP|POLLRDHUP};
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-28
      • 1970-01-01
      • 2015-07-05
      • 2015-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多