Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/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
C++ 线程中TCP套接字的奇怪行为_C++_Sockets_Tcp_Winsock - Fatal编程技术网

C++ 线程中TCP套接字的奇怪行为

C++ 线程中TCP套接字的奇怪行为,c++,sockets,tcp,winsock,C++,Sockets,Tcp,Winsock,我们有一个通过TCP套接字发送数据的应用程序。我们为此使用8个TCP连接。套接字发送和接收在后台线程中调用。只有一个线程在套接字数组上迭代以通过所有套接字发送数据(顺序) 发件人线程中的代码类似于: for(i = 0; i < 8; i++) { nBytesWrriten = send (tcpsock[i], data2, nleft, 0)) //error handling and process more data } (i=0;i

我们有一个通过TCP套接字发送数据的应用程序。我们为此使用8个TCP连接。套接字发送和接收在后台线程中调用。只有一个线程在套接字数组上迭代以通过所有套接字发送数据(顺序)

发件人线程中的代码类似于:

for(i = 0; i < 8; i++) {

    nBytesWrriten = send (tcpsock[i], data2, nleft, 0))
    //error handling and process more data

}
(i=0;i<8;i++)的
{
nbyteswriten=send(tcpsock[i],data2,nleft,0))
//错误处理和处理更多数据
}
接收器线程如下所示:

for(i = 0; i < 8; i++) {

    sz[i] = recv (tcpsock[i], data, MAX_UDT_SIZE, 0);
    //process data
}
(i=0;i<8;i++)的
{
sz[i]=recv(tcpsock[i],数据,最大UDT大小,0);
//过程数据
}
一切正常,数据也会被传输,但有时需要的时间太长。 在检查日志时,我发现在大多数情况下,发送者线程工作得很好,但有时,在“发送”调用之前和之后,时间戳会有巨大的延迟(有时超过一秒)

所有发送和接收操作都在工作线程中进行。这是否与在发送呼叫之前/发送呼叫时抢占线程有关?我可以避免在发送调用之前抢占线程吗?或者是接收方线程在发送更多数据准备就绪时没有在套接字上接收数据,因此导致延迟

由于发送数据花费的时间太长,如何对此进行优化


谢谢

您应该使用非阻塞套接字进行发送。可能发生的情况是,一个(或多个)无法立即发送,因此它会等待,直到它可以发送一些数据,可能是缓冲区已满或其他任何数据


使用非阻塞套接字不会停止,但您必须检查数据是否未发送到某些套接字,然后重试。

在发送之前在每个套接字上执行
选择
,查看是否可以不阻塞地写入,否则将阻塞其他套接字上的发送。您将希望在读取端执行相同的操作,否则,其中一个的可读性不足可能会阻止其他应用程序的可用读取。

您可以使用类似工具来检查是否存在比应用程序更低级别的延迟。您的套接字是否无阻塞(
O_NONBLOCK
)?如果没有,则在本地TCP堆栈接受所有数据之前,
send()
调用将不会返回(这只是在某种程度上与线路上的输出有关,可能是即时的,也可能需要一些时间)。包括wireshark/tcpdump跟踪可能会有所帮助。@默认设置,他说发送延迟(块)并且只有一个线程。从设计角度来看,您应该做的是在两端同时对所有套接字执行
选择
,并对每个就绪的套接字执行循环写入和读取。如果所有套接字都没有准备好,这将阻止自旋轮询。。。