c++ - 线程中 TCP 套接字的奇怪行为

标签 c++ sockets tcp winsock

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

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

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

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

谢谢

最佳答案

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

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

关于c++ - 线程中 TCP 套接字的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13344197/

相关文章:

使用 poll() 检测连接丢失

c++ - 调试时无效句柄异常

c++ - Visual C++ 2017错误?编译器优化表达式

c++ - 虚继承应该写 "public virtual"还是 "virtual public"?

python - 通过套接字发送文件

java - 如何处理socket程序中的连接重置错误

通过服务器连接 2 个套接字客户端

C++ 变量在 "if"循环中丢失赋值

python - select.select 套接字和管道问题

C# 程序在关闭表单后继续在进程中运行