0

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

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

所有发送和接收操作都发生在工作线程中。这与在发送调用之前/期间抢占线程有关吗?我可以避免在发送调用之前抢占线程吗?或者是接收线程在发送更多数据时没有收到套接字上的数据,因此导致延迟?

由于发送数据花费的时间太长,我该如何优化?

谢谢

4

2 回答 2

1

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

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

于 2012-11-12T13:07:22.773 回答
0

在发送之前对每个套接字执行一个select操作,看看您是否可以在不阻塞的情况下进行写入,否则您将阻塞其他套接字上的发送。你会想在读取端做同样的事情,或者缺乏可读性可能会阻止其他人的可用读取。

于 2012-11-12T13:31:54.903 回答