我使用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()命令,一个接一个。
整个过程需要30 to才能完成。我发现奇怪的是大部分时间都去的地方。在对每一项活动进行计时之后,我得到了以下信息:
为什么第一个send命令需要这么长的时间才能完成,即使它只有1字节的数据,而其余的数据则在创纪录的时间内完成。在每次循环运行之间,大约有20 is的时间延迟等待GPU代码完成。TCP连接是否进入休眠状态,如果进入睡眠状态,我可以以某种方式禁用它吗?
TCP套接字代码:
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);
}
有关守则:
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库)。
提前谢谢你!
发布于 2017-07-23 18:40:14
您可能正在遭受“Nagle的算法”(参见algorithm )的惩罚
长话短说,存在一个内置到TCP/IP的延迟,目的是收集足够的数据,以便在发送第一个数据包之前值得发送数据包。在打开套接字时可以使用一个TCP_NODELAY选项来禁用它,如果这对您有问题的话。
尽管如此,如果性能是至关重要的,那么您最好使用共享内存来进行进程间通信,而不是使用套接字。
https://stackoverflow.com/questions/45268581
复制相似问题