Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
已连接MultiClient服务器,但未正确接收消息 我必须用C++套接字创建一个基本的P2P连接,这意味着每个用户都有一个监听连接的服务器和一个连接的客户端,对吗?_C++_Network Programming - Fatal编程技术网

已连接MultiClient服务器,但未正确接收消息 我必须用C++套接字创建一个基本的P2P连接,这意味着每个用户都有一个监听连接的服务器和一个连接的客户端,对吗?

已连接MultiClient服务器,但未正确接收消息 我必须用C++套接字创建一个基本的P2P连接,这意味着每个用户都有一个监听连接的服务器和一个连接的客户端,对吗?,c++,network-programming,C++,Network Programming,现在我正在尝试创建一个主客户端,它有一个专用的服务器,也是一个客户端 这意味着在同一个程序中创建服务器和客户机,我使用了fork,它创建了服务器的子进程,父进程是客户机。现在,fork工作正常,我使用select检查套接字以读取数据,并在此基础上对服务器进行了建模 现在,当我运行该程序时,主客户机能够连接到自己的专用服务器,但是服务器并不总是接收消息。有时候,它收到了,有时候没有。知道为什么吗 另外,当第二个客户机连接到主客户机,并且它现在没有自己的服务器时,服务器显示它获得了一个新的连接,但是

现在我正在尝试创建一个主客户端,它有一个专用的服务器,也是一个客户端

这意味着在同一个程序中创建服务器和客户机,我使用了fork,它创建了服务器的子进程,父进程是客户机。现在,fork工作正常,我使用select检查套接字以读取数据,并在此基础上对服务器进行了建模

现在,当我运行该程序时,主客户机能够连接到自己的专用服务器,但是服务器并不总是接收消息。有时候,它收到了,有时候没有。知道为什么吗

另外,当第二个客户机连接到主客户机,并且它现在没有自己的服务器时,服务器显示它获得了一个新的连接,但是当我编写消息并发送它时,它不会从第二个客户机接收任何消息,但它有时会从主客户机接收消息,而不是总是这样

编辑:添加了cout.flush

编辑:我认为当客户机和服务器在同一个程序上运行时,分叉进程会导致一些延迟

更新:添加了新的服务器代码,该代码导致响应注释的消息延迟一次 这是密码

服务器代码

while (1) {
    unsigned int s;
    readsocks = socks;
    if (select(maxsock + 1, &readsocks, NULL, NULL, NULL) == -1) {
        perror("select");
        return ;
    }
    for (s = 0; s <= maxsock; s++) {
        if (FD_ISSET(s, &readsocks)) {
            //printf("socket %d was ready\n", s);
            if (s == sock) {
                /* New connection */
                cout<<"\n New Connection";
                cout.flush();
                int newsock;
                struct sockaddr_in their_addr;
                socklen_t size = sizeof(their_addr);
                newsock = accept(sock, (struct sockaddr*)&their_addr, &size);
                if (newsock == -1) {
                    perror("accept");
                }
                else {
                    printf("Got a connection from %s on port %d\n",
                            inet_ntoa(their_addr.sin_addr), htons(their_addr.sin_port));
                    FD_SET(newsock, &socks);
                    if (newsock > maxsock) {
                        maxsock = newsock;
                    }
                }
            }
            else {
                /* Handle read or disconnection */
                handle(s, &socks);
            }
        }
    }

}


void handle(int newsock, fd_set *set)
{
    char buf[256];
    bzero(buf, 256);
    /* send(), recv(), close() */
    if(read(newsock, buf, 256)<=0){
        cout<<"\n No data";
        FD_CLR(newsock, set);
        cout.flush();
    }

    else {
        string temp(buf);
        cout<<"\n Server: "<<temp;
        cout.flush();
    }
    /* Call FD_CLR(newsock, set) on disconnection */
}

这可能只是因为您在这一行之后没有刷新:cout@DavidSchwartz我试过cout.flush,但没用,我用printf代替cout。同样的问题仍然存在。我的主要问题是为什么第二个客户端无法向服务器发送任何消息,为什么第一个客户端不总是发送数据。这和select的延迟有什么关系吗?你能告诉我你把冲水放在哪里了吗?@DavidSchwartz我把它放在了你提到的地方。@DavidSchwartz我觉得select有点延迟或什么的。while循环似乎在中途暂停,在从客户端发送几条消息后,服务器能够打印最后发送的消息,而之前的消息将丢失。