我们有一个应用程序,通过TCP套接字发送数据。我们为此使用8个TCP连接。套接字发送和接收在后台线程中调用。只有一个线程遍历套接字数组来发送数据(顺序)。线程中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
}
一切工作正常,得到的数据传输,但有时它只是时间太长。 在检查日志时,我发现在大多数情况下,发送者线程工作得很好,但有时候,'发送'呼叫之前和之后在时间戳(有时超过一秒)方面存在巨大延迟。
所有发送和接收操作都发生在工作线程中。在发送呼叫之前/在发送呼叫之前是否需要抢占线程?我可以在发送呼叫之前避免抢占线程吗?还是说接收线程在发送准备好更多的数据时没有收到套接字上的数据,因此会导致延迟?
如何优化它,因为发送数据花费的时间太长?
谢谢
您可以使用像[Wireshark](http://www.wireshark.org/)这样的工具来检查是否有任何延迟低于您的应用程序。 – Default
你的套接字是否阻塞('O_NONBLOCK')?如果不是,直到所有的数据已被本地TCP堆栈接受(这只与线路上的内容有关,可能是立即的或可能需要一些时间),send()调用才会返回。包括wireshark/tcpdump跟踪可能会有所帮助。 –