C++ 返回不同值的Winsock select函数

C++ 返回不同值的Winsock select函数,c++,winsock,C++,Winsock,我正在从事具有客户机-服务器体系结构的项目。select函数在不同的场景中返回不同的值,具体如下 情景1: 当我在我的机器上安装服务器时,停止所有相应的服务,我的客户端进入DC状态,现在select的返回值为1,read_mask.fd_count也为1 情景2: 当我连接到远程服务器(abc.com)并断开无线连接时。在这种情况下,相同的函数返回0,同时read_mask.fd_count为0。我尝试将超时变量值从10毫秒更改为50秒。我想不出这个问题 当您关闭服务器并导致网络堆栈关闭连接

我正在从事具有客户机-服务器体系结构的项目。select函数在不同的场景中返回不同的值,具体如下

  • 情景1:

    当我在我的机器上安装服务器时,停止所有相应的服务,我的客户端进入DC状态,现在select的返回值为1,read_mask.fd_count也为1

  • 情景2:

    当我连接到远程服务器(abc.com)并断开无线连接时。在这种情况下,相同的函数返回0,同时read_mask.fd_count为0。我尝试将超时变量值从10毫秒更改为50秒。我想不出这个问题


当您关闭服务器并导致网络堆栈关闭连接时,将非常感谢您提供的任何帮助。进一步的连接请求被拒绝。
选择
表示有东西,
recv()
返回0表示
强制关闭

当您将无线电缆从插头中拔出时,客户端既不会收到关机请求,也不会收到连接请求。您等待任何超时来检测不可用的服务器

在现实世界的应用程序中,您应该在协议中实现一种心跳,允许在第二种场景中检测“断开连接的状态”


编辑:如果Winsock实现支持,还可以将其配置为检测丢失的连接。另请参见:。

您是否已阅读文档?它非常清楚地说明了可能的返回值是什么以及它们的含义。而且,
fd_集
的内部数据就是内部数据。您应该只使用提供的宏来访问它。是的,我已经阅读了它们,但无法准确理解0和1之间的差异。在这两种情况下,返回值应该相同(因为在这两种情况下都不是套接字错误)
select
函数在超时时返回零(无论超时的长度如何)。当返回的集合中有一个套接字就绪时,它返回
1
。如果有两个套接字准备就绪,则
select
将返回
2
。如果读取集中有一个套接字,并且
select
返回
0
,则表示在您要求
select
等待的时间内,该套接字上没有收到任何内容。就这么简单,你还没有收到数据。为什么?这是我们无法回答的问题,这完全取决于连接的另一端。在第二个场景中,可以使用什么方法检查服务器是否已断开连接?@AliKazmi这在我的第三段中得到了回答。