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

时间:2012-11-12 13:01:57

标签: 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

}

,接收者线程如下:

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

    sz[i] = recv (tcpsock[i], data, MAX_UDT_SIZE, 0);
    //process data
}

一切正常,数据传输,但有时只需要太长时间。 在检查日志时,我发现在大多数情况下,发送方线程工作得很好,但有时候,“发送”调用之前和之后的时间戳(有时超过一秒)会有很大的延迟。

所有发送和接收操作都发生在工作线程中。是否与发送呼叫之前/之后的线程抢占有关?我可以在发送呼叫之前避免线程的抢占吗?或者接收器线程是否在接收到套接字数据的同时发送更多数据,因此导致延迟?

如何优化此功能,因为发送数据需要很长时间?

由于

2 个答案:

答案 0 :(得分:1)

您应该使用非阻塞套接字进行发送。可能发生的事情是一个(或多个)不能立即发送,所以它等待它可以发送一些数据,可能是缓冲区满或任何其他。

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

答案 1 :(得分:0)

在发送之前在每个套接字上执行select以查看是否可以不阻塞地写入,否则您将阻止其他套接字上的发送。你会想要在阅读方面做同样的事情,或者缺乏可读性可以阻止对他人的可读。