线程中带有TCP插座的奇怪行为
Strange behaviour with TCP sockets in thread
我们有一个应用程序,可以通过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
,以查看是否可以写入而无需阻塞,否则您将阻止其他插座上的发送。您需要在读取方面做同样的事情,或者缺乏可读性可以阻止其他可用的阅读。
相关文章:
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 是否可以用"iostream"包装现有的TCP/OOpenSSL会话
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 提升 Asio TCP 服务器 处理多个客户端
- 通过TCP的PvP通信问题
- C++ boost::asio::ip::tcp::acceptor 有时不接受连接器?
- AWS IoT 开发工具包:通过 TCP 端口 443 使用 MQTT
- 计算出有多少客户端可以连接到我正在使用的一些tcp服务器代码
- TOS字段从Linux的TCP插座上接收到的数据包获取
- Python/C 远程TCP插座
- 用TCP插座复制破损的管道误差
- BOOST :: ASIO :: TCP双向通信在插座上
- 处理插座Boost ASIO TCP IP -C 套接字编程
- 从TCP插座读取
- TCP插座即使在执行sendall()后也无法发送数据
- 线程中带有TCP插座的奇怪行为
- C 中TCP插座上的可变长度消息
- 单流TCP插座将用于入站和出站连接
- TCP插座需要何时需要保持贴生