线程中带有TCP插座的奇怪行为

Strange behaviour with TCP sockets in thread

本文关键字:插座 TCP 线程      更新时间:2023-10-16

我们有一个应用程序,可以通过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
}

一切正常,数据也会传输,但有时需要太长。在检查日志时,我发现在大多数情况下,发件人线程效果很好,但是有时,"发送"呼叫之前和之后的时间戳(有时超过一秒钟)有很大的延迟。

所有发送和接收措施都在工人线程中进行。这与在发送通话之前/打开通话之前/在发送通话之前的主题有关吗?我可以在发送呼叫之前避免线程的先发制人吗?还是接收器线程在发送更多数据时未收到套接字上的数据,因此会导致延迟?

如何优化它,因为它花费了太长时间发送数据?

谢谢

您应该使用非阻止插座发送。可能发生的事情是,一个(或一个以上)无法立即发送,因此它等到它可以发送一些数据,也许是填充或其他。

使用非阻止插座它不会停止,但是您必须检查数据是否未发送到某些插座并稍后再试。

在发送之前,请在每个套接字上执行select,以查看是否可以写入而无需阻塞,否则您将阻止其他插座上的发送。您需要在读取方面做同样的事情,或者缺乏可读性可以阻止其他可用的阅读。