为什么在使用select()" break"时使用第二个套接字连接服务器?第一次连接?

时间:2017-05-16 22:34:59

标签: c++ sockets tcp network-programming

我按照教程(该部分底部附近的大代码块) 位置:http://beej.us/guide/bgnet/output/html/multipage/advanced.html#select 主服务器代码如下:

while (true)
{   
    read_fds = master;
    if (select(fd_max + 1, &read_fds, NULL, NULL, NULL) == -1)
    {   
        cerr << "ERROR. Select failed" << endl;
        return -1;
    }

    for (int i = 0; i <= fd_max; i++)
    {   
        if (FD_ISSET(i, &read_fds))
        {   
            if (i == welcome_socket)
            {   
                cout << "NEW CONNECTION" << endl;
                client_len = sizeof(struct sockaddr_in);
                client_sock = accept(welcome_socket, (struct sockaddr *) &client_addr, &client_len);
                if (client_sock != -1)
                {   
                    FD_SET(client_sock, &master);
                    if (client_sock > fd_max)
                    {   
                        fd_max = client_sock;
                    }
                }
            }
            else
            {   
                int length, total_read = 0;

                // CONNECTION CLOSED BY CLIENT
                if (safe_recv(client_sock, &length, sizeof(int)) <= 0)
                {   
                    cout << "CONNECTION CLOSED" << endl;
                    close(i);
                    FD_CLR(i, &master);
                }
                else
                {   
                    char *message = (char *)memset((char *)malloc(length + 1), 0, length);
                    // while ((total_read += safe_recv(client_sock, message + total_read, length - total_read)) < length) {}
                    safe_recv(client_sock, message, length);

                    // RESPOND WITH MESSAGE
                    cout << "MESSAGE: " << message << endl;

                    write(client_sock, process(message), length);
                    free(message);
                }
            }
        }
    }
}

我正在做的是首先(从客户端)发送字符串的长度,然后是字符串本身。然后服务器发回process(message)。 当我只有1个连接时,我看到了正确的行为。但是,如果已连接1并连接新客户端,我所看到的是:

  • 第一个客户端不再从服务器发送或接收任何内容(因为客户端没有打印到stdout,因此结束)
  • 第二个客户正在按预期工作
  • 当第二个连接退出时,服务器计算两个连接都退出(两次打印CONNECTION CLOSED

我试图将其与教程代码非常相似。我已经运行了教程服务器,并且可以按照预期的方式运行多个客户端。 我是网络编程的新手,所以如果这是一个初学者问题或者我忽略了一些愚蠢的事情,我会道歉。

1 个答案:

答案 0 :(得分:1)

代码仅从client_sock读取和写入,client_sock将替换为代码的接受处理部分中的新套接字。

您很可能希望与i而不是client_sock进行互动。