首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >IPC首先在C++ TCP中发送()和recv()调用需要更长的时间。

IPC首先在C++ TCP中发送()和recv()调用需要更长的时间。
EN

Stack Overflow用户
提问于 2017-07-23 18:32:33
回答 1查看 455关注 0票数 0

我使用IPC (进程间通信)在两个C++程序之间发送数据.对于IPC,我使用基本的TCP/IP Winsock2代码。

基本上,我的想法是在这两个应用程序之间发送3D数据帧,一个使用GPU/CUDA处理数据,另一个使用3de派对库(PCL)显示数据。我的应用程序数据非常丰富(即30 far,每帧4 My ),但据我所知,这对IPC来说不应该是个问题。

因此,当每一帧在GPU上完成处理时,我将帧数据(X、Y、Z型浮点数;R、G、B型uint8_t )转换为字节,并一个接一个地发送。

我注意到了一些奇怪的事情。在我的代码中,我有9个send()命令,一个接一个。

  • 1 1ste :发送一个字符作为帧的名称。
  • 2de :具有输入的3D点数量的单一int。
  • 3-5: RGB值
  • 6-8: XYZ值
  • 9:结束通信检查以关闭查看器应用程序。

整个过程需要30 to才能完成。我发现奇怪的是大部分时间都去的地方。在对每一项活动进行计时之后,我得到了以下信息:

  • 1ste :20 (1字节数据)
  • 2de:<1ms (4字节数据)
  • 3-5 : 2ms (921600字节的数据)
  • 6-8 : 3ms (3686400字节数据)
  • 9: 1ms (1字节数据)

为什么第一个send命令需要这么长的时间才能完成,即使它只有1字节的数据,而其余的数据则在创纪录的时间内完成。在每次循环运行之间,大约有20 is的时间延迟等待GPU代码完成。TCP连接是否进入休眠状态,如果进入睡眠状态,我可以以某种方式禁用它吗?

TCP套接字代码:

代码语言:javascript
运行
复制
SOCKET Create_Server_Socket(PCSTR IP, PCSTR port)
{
struct addrinfo *result = NULL, *ptr = NULL, hints;
int iResult;

ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_flags = AI_PASSIVE;

// Resolve the local address and port to be used by the server
iResult = getaddrinfo(NULL, port, &hints, &result);
if (iResult != 0) {
    printf("getaddrinfo failed: %d\n", iResult);
    WSACleanup();
    return 1;
}

SOCKET ListenSocket = INVALID_SOCKET;

ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);

if (ListenSocket == INVALID_SOCKET) {
    printf("Error at socket(): %ld\n", WSAGetLastError());
    freeaddrinfo(result);
    WSACleanup();
    return 1;
}

iResult = bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen);
if (iResult == SOCKET_ERROR) {
    printf("bind failed with error: %d\n", WSAGetLastError());
    freeaddrinfo(result);
    closesocket(ListenSocket);
    WSACleanup();
    return 1;
}

freeaddrinfo(result);

if (listen(ListenSocket, SOMAXCONN) == SOCKET_ERROR) {
    printf("Listen failed with error: %ld\n", WSAGetLastError());
    closesocket(ListenSocket);
    WSACleanup();
    return 1;
}

SOCKET ClientSocket;

ClientSocket = INVALID_SOCKET;

// Accept a client socket
ClientSocket = accept(ListenSocket, NULL, NULL);
if (ClientSocket == INVALID_SOCKET) {
    printf("accept failed: %d\n", WSAGetLastError());
    closesocket(ListenSocket);
    WSACleanup();
    return 1;
}

return (ClientSocket);

}

有关守则:

代码语言:javascript
运行
复制
iResult = send(ConnectSocket, (char*)&name, sizeof(char), 0);  //Takes >20ms to complete
iResult = send(ConnectSocket, (char*)&points, 4, 0);
iResult = send(ConnectSocket, (char*)Red_t, sizeof(uint8_t) * depth_width *depth_height, 0);
iResult = send(ConnectSocket, (char*)Green_t, sizeof(uint8_t) * depth_width *depth_height, 0);
iResult = send(ConnectSocket, (char*)Blue_t, sizeof(uint8_t) * depth_width *depth_height, 0);
iResult = send(ConnectSocket, (char*)z_t, sizeof(uint16_t) * depth_width *depth_height, 0);
iResult = send(ConnectSocket, (char*)x_t, sizeof(float) * depth_width *depth_height, 0)
iResult = send(ConnectSocket, (char*)y_t, sizeof(float) * depth_width *depth_height, 0);
iResult = send(ConnectSocket, "a", sizeof(char), 0);

我正在开发Windows 10 (即Winsock2库)。

提前谢谢你!

EN

回答 1

Stack Overflow用户

发布于 2017-07-23 18:40:14

您可能正在遭受“Nagle的算法”(参见algorithm )的惩罚

长话短说,存在一个内置到TCP/IP的延迟,目的是收集足够的数据,以便在发送第一个数据包之前值得发送数据包。在打开套接字时可以使用一个TCP_NODELAY选项来禁用它,如果这对您有问题的话。

尽管如此,如果性能是至关重要的,那么您最好使用共享内存来进行进程间通信,而不是使用套接字。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45268581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档