我有一个使用 mpi 的 C++ 程序,它遵循典型的客户端服务器模型。客户端的每个 mpi 实例都连接到服务器的相应 mpi 实例。在我不得不进行一些增加延迟的测试(准确地说是增加了 1 秒的延迟)之前,这种方法的效果相对较好。
问题:有时服务器进程之一认为客户端未连接,但客户端认为它已连接。即使用gdb 后,服务器在accept() 处等待,但客户端在过去的connect() 处继续。因此,当服务器认为它没有连接时,客户端似乎认为它已经连接。
我最好的猜测是我需要在某处设置一个 sock-option,但是与其他程序员交谈和谷歌搜索并没有产生任何有用的结果。
编辑:有两组 MPI 进程(因此对 mpirun 的两个不同调用),accept() 和 connect() 调用用于套接字,它们位于两组 MPI 进程之间。它是openmpi。
代码(实际上来自别人的代码)[减少]:
客户端(连接代码):(m_socket 是实际的套接字)
if (-1 == m_socket)
{
perror("cannot create socket");
exit(EXIT_FAILURE);
}
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
res = inet_pton(AF_INET, host_ip, &addr.sin_addr);
if (0 > res)
{
perror("error: first parameter is not a valid address family");
close(m_socket);
exit(EXIT_FAILURE);
}
else if (0 == res)
{
perror("error: second parameter does not contain valid IP address");
close(m_socket);
exit(EXIT_FAILURE);
}
//backoff
for (int sec = 1; sec < 20000; sec++ )
{
int ret;
if (0 == (ret = connect(m_socket, (struct sockaddr *)&addr, sizeof(addr))))
{
return;
}
sleep(1);
close(m_socket);
m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
}
perror("connect failed");
close(m_socket);
exit(EXIT_FAILURE);
服务器:(m_socket 是实际的套接字)
int socket = ::accept(m_socket, NULL, NULL);
if(socket < 0)
{
fprintf(stderr, "accept() failed: %s\n", strerror(errno));
close(m_socket);
exit(EXIT_FAILURE);
}