Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查recv是否正在运行_C_Multithreading_Sockets_Winsock - Fatal编程技术网

检查recv是否正在运行

检查recv是否正在运行,c,multithreading,sockets,winsock,C,Multithreading,Sockets,Winsock,我有一个服务器程序,它为它接受的每个连接创建一个新线程。此线程中调用的函数始终相同。它有一个无限的do…while语句,用于回复接收到的任何数据。另外,我使用的是阻塞模式套接字,因此recv阻塞线程这一事实是预期的和令人满意的 我的问题是,有时程序的主线程需要检查套接字的连接状态(或网络连接状态) 关于这个问题,我读了很多书,但没有发现任何关于阻塞模式套接字的内容;但是我发现了非阻塞套接字的问题(使用recv,如下所述): 此函数发送1字节的数据并返回值。通过该值和WSAGetLastError

我有一个服务器程序,它为它接受的每个连接创建一个新线程。此线程中调用的函数始终相同。它有一个无限的
do…while
语句,用于回复接收到的任何数据。另外,我使用的是阻塞模式套接字,因此
recv
阻塞线程这一事实是预期的和令人满意的

我的问题是,有时程序的主线程需要检查套接字的连接状态(或网络连接状态)

关于这个问题,我读了很多书,但没有发现任何关于阻塞模式套接字的内容;但是我发现了非阻塞套接字的问题(使用
recv
,如下所述):

此函数发送1字节的数据并返回值。通过该值和
WSAGetLastError()
函数,我们可以检查连接的状态

但是我担心当我调用检查套接字状态的函数时,
recv
函数可能正在其他线程上运行。如果我更改套接字阻塞模式,它可能返回错误值,并将自己的值“设置”为
WSAGetLastError()
函数

所以我的问题是如何检查
recv
是否在另一个线程上运行。

我找了很多,但什么也没找到。另外,我还没有发现改变阻塞模式是否会影响recv
recv
,以及它是否为WSA错误“设置”了自己的值


注意:是的,我知道我可以在我的线程上检查
recv
的结果,但我需要检查它是否从其他线程运行,而不是找到它的结果。

你说的“检查recv函数当前是否在其他线程上运行”是什么意思?是否要检查线程是否被阻止并等待数据?或者远程端没有关闭套接字(即连接处于活动状态),因此另一个线程可以预期会有更多数据?如果发生硬套接字错误,线程中的recv()将看到该错误(返回值为0或-1)。如果你真的追求的是保证线程正在与那些没有悄然离去的客户(他们的计算机停机,中间的路由器死掉等)交谈,那么设置KePiValk是最好的选择。这样,当TCP堆栈发现连接不可行时,线程的recv()调用将看到错误。查找setsockopt/SO_KEEPALIVE以及WSAIoctl/SIO_KEEPALIVE_VALS(使活动检查更频繁)。使用受互斥保护的变量。在另一个线程中调用
recv
之前将其设置为true,并在
recv
返回后将其清除。例如,通过将变量设置为“recv running”.XY problem,使线程报告其状态。(1) 使用MSG_PEEK不会改变套接字的阻塞模式。(2) main方法不需要调用
recv()
来检查网络状态,如果其他东西已经在调用
recv()
。连接线程应该维护有关其连接状态的数据,主线程应该检查该数据。
char buf;
int recResult=recv(sock,&buf,1,MSG_PEEK);