gpt4 book ai didi

c++ - 客户端连接到服务器,但服务器认为客户端没有连接到 C++

转载 作者:太空宇宙 更新时间:2023-11-04 14:06:28 24 4
gpt4 key购买 nike

我有一个使用 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);
}

最佳答案

看起来您正在尝试手动进行连接/接受,而不是使用 MPI。如果您尝试使用 MPI 进行连接,则可以查看 Deino ( http://mpi.deino.net/mpi_functions/MPI_Comm_accept.html) 上的示例。

或者,您可能只需要查看更通用的 MPI 教程(此处提供一些教程:http://www.mcs.anl.gov/research/projects/mpi/tutorial/)以了解通信的工作原理。大多数时候,应用程序不使用 Connect/Accept 进行通信,而是使用 MPI Communicators 来建立进程之间的通信机制。这是一个不同的模型(SPMD 与 MPMD 相对)。

关于c++ - 客户端连接到服务器,但服务器认为客户端没有连接到 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16703443/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com