我们有一个应用程序,我们通过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
}
一切正常,数据传输,但有时只需要太长时间。 在检查日志时,我发现在大多数情况下,发送方线程工作得很好,但有时候,“发送”调用之前和之后的时间戳(有时超过一秒)会有很大的延迟。
所有发送和接收操作都发生在工作线程中。是否与发送呼叫之前/之后的线程抢占有关?我可以在发送呼叫之前避免线程的抢占吗?或者接收器线程是否在接收到套接字数据的同时发送更多数据,因此导致延迟?
如何优化此功能,因为发送数据需要很长时间?
由于
答案 0 :(得分:1)
您应该使用非阻塞套接字进行发送。可能发生的事情是一个(或多个)不能立即发送,所以它等待它可以发送一些数据,可能是缓冲区满或任何其他。
使用非阻塞套接字不会停止,但您必须检查数据是否未发送到某些套接字,稍后再试。
答案 1 :(得分:0)
在发送之前在每个套接字上执行select
以查看是否可以不阻塞地写入,否则您将阻止其他套接字上的发送。你会想要在阅读方面做同样的事情,或者缺乏可读性可以阻止对他人的可读。