客户端连接到服务器,但服务器不认为客户端已连接到C++; 我有一个C++程序,使用MPI,它遵循典型的客户机-服务器模型。客户端的每个mpi实例都连接到服务器的相应mpi实例。在我不得不使用附加延迟(精确地说是附加延迟的1秒)进行一些测试之前,这种方法一直工作得比较好

客户端连接到服务器,但服务器不认为客户端已连接到C++; 我有一个C++程序,使用MPI,它遵循典型的客户机-服务器模型。客户端的每个mpi实例都连接到服务器的相应mpi实例。在我不得不使用附加延迟(精确地说是附加延迟的1秒)进行一些测试之前,这种方法一直工作得比较好,c++,networking,client-server,mpi,C++,Networking,Client Server,Mpi,问题: 有时,其中一个服务器进程不认为客户端已连接,但客户端认为它已连接。i、 e.使用gdb后,服务器在accept()处等待,但客户端在过去的connect()上继续。因此,当服务器不认为客户端已连接时,客户端似乎认为客户端已连接 我最好的猜测是,我需要在某个地方设置一个sock选项,但是与其他程序员交谈和谷歌搜索并没有产生任何有用的结果 编辑: 有两组MPI进程(因此对mpirun有两个不同的调用),accept()和connect()调用用于套接字,它们位于两组MPI进程之间。它是ope

问题: 有时,其中一个服务器进程不认为客户端已连接,但客户端认为它已连接。i、 e.使用gdb后,服务器在accept()处等待,但客户端在过去的connect()上继续。因此,当服务器不认为客户端已连接时,客户端似乎认为客户端已连接

我最好的猜测是,我需要在某个地方设置一个sock选项,但是与其他程序员交谈和谷歌搜索并没有产生任何有用的结果

编辑: 有两组MPI进程(因此对mpirun有两个不同的调用),accept()和connect()调用用于套接字,它们位于两组MPI进程之间。它是openmpi

代码(实际上来自其他人的代码)[简化]:

客户端(连接代码):(m_套接字是实际的套接字)

if(-1==m_插槽)
{
perror(“无法创建套接字”);
退出(退出失败);
}
memset(&addr,0,sizeof(addr));
addr.sin_family=AF_INET;
地址SINU port=htons(端口);
res=inet\u pton(AF\u inet、host\u ip和addr.sin\u addr);
如果(0>res)
{
perror(“错误:第一个参数不是有效的地址族”);
关闭(m_插座);
退出(退出失败);
}
else如果(0==res)
{
perror(“错误:第二个参数不包含有效的IP地址”);
关闭(m_插座);
退出(退出失败);
}
//退避
用于(整数秒=1;秒<20000;秒++)
{
int ret;
if(0==(ret=connect(m_socket,(struct sockaddr*)和addr,sizeof(addr)))
{
返回;
}
睡眠(1);
关闭(m_插座);
m_socket=socket(AF_INET、SOCK流、IPPROTO_TCP);
}
perror(“连接失败”);
关闭(m_插座);
退出(退出失败);
服务器:(m_套接字是实际的套接字)

intsocket=::接受(m_socket,NULL,NULL);
如果(插座<0)
{
fprintf(stderr,“accept()失败:%s\n”,strerror(errno));
关闭(m_插座);
退出(退出失败);
}

看起来您正在尝试手动连接/接受,而不是使用MPI。如果您试图使用MPI进行连接,可以查看Deino()上的示例


或者,您可能只需要看一个更通用的MPI教程(这里有一些教程:)就可以了解通信是如何工作的。大多数情况下,应用程序不使用Connect/Accept进行通信,而是使用MPI通信器在进程之间建立通信机制。它是一种不同的型号(SPMD而不是MPMD)。

客户机和服务器运行在不同的主机上吗?您确定已将客户端连接到正确的IP:端口吗?我确定,它有时工作,有时失败,但运行参数相同。这是在同一台主机上。对我来说,听起来像是一个比赛条件。。。您的服务器代码是多线程的吗?如果是这样,如何处理套接字的多线程?是否有可能是accept()返回了有问题的套接字,然后不知何故从裂缝中掉了出来,因此服务器再次在accept()上阻塞,而“丢失”的套接字没有被任何其他线程处理?每个MPI进程都有一个线程,每个客户端MPI进程都有一个到服务器MPI进程的套接字。我不知道它会如何返回accept,但又会返回…您使用的是什么MPI实现?看起来奇怪的是,您的公开了
accept()
connect()
    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);
    int socket = ::accept(m_socket, NULL, NULL);

    if(socket < 0)
    {
            fprintf(stderr, "accept() failed: %s\n", strerror(errno));
            close(m_socket);
            exit(EXIT_FAILURE);
    }