【问题标题】:Why does connecting to server with 2nd socket while using select() "break" first connection?为什么在使用 select() “中断”第一个连接时使用第二个套接字连接到服务器?
【发布时间】:2017-05-16 22:34:59
【问题描述】:

我正在学习教程(该部分底部附近的大代码块) 这里: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 已经连接并且我连接了一个新客户端,我看到的是:

  • 第一个客户端不再从服务器发送或接收任何内容(结论是因为客户端没有任何内容打印到标准输出)
  • 第二个客户端按预期工作
  • 当第二个连接退出时,服务器将其视为两个连接都退出(打印 CONNECTION CLOSED 两次)

我试图保持与教程代码非常相似。我已经运行了教程服务器,并且可以与多个客户端一起使用。 我是网络编程的新手,所以如果这是一个初学者问题或只是我忽略的愚蠢问题,我深表歉意。

【问题讨论】:

    标签: c++ sockets tcp network-programming


    【解决方案1】:

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

    您很可能希望与i 互动,而不是client_sock

    【讨论】:

    • 啊开枪!当我从只允许单个客户端转换为多客户端时,我忽略了这一点。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-10-20
    • 2022-09-28
    • 2011-04-27
    • 1970-01-01
    • 2017-05-10
    • 2017-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多