我正在使用C创建聊天服务器/客户端,并且正在使用select()监视我的套接字。

该程序分为三个部分,服务器,查看客户端。和提交客户。提交客户端将套接字连接到服务器,并且当要从客户端读取文本时,选择将触发需要读取的文本。如果是新的客户端连接,则select也会触发,这样我就可以接受该连接并将套接字分配给客户端。

我的问题是查看客户端,它应该在可写时触发选择。但是,当有新连接时,select不执行任何操作。 This来源声称,仅当select-fd已连接时,才会在select-fd上触发select。但是,如何连接新的编写客户端?

服务器:

if (select(128, &read_fds, &write_fds, NULL, NULL) == -1){
    ...
}

if (FD_ISSET(viewing_socket, &write_fds)){
    printf("%d is a new observer connection\n", viewing_socket);
    new_observer_connection();
}
if (FD_ISSET(submitting_socket, &read_fds)){
    printf("%d is a new participant connection\n", submitting_socket);
    new_participant_connection();
}

因此,当一个新的提交客户端连接时,它接受该连接并将该新套接字添加到&read_fds以监视读取。但是,新的查看客户端连接似乎没有触发任何事件。

最佳答案

发布此消息几秒钟后,我找到了解决方案。当有新客户端时,都需要从中读取监听套接字。只有接受连接后,才会监视新套接字的写入。监听新连接的套接字显然需要读取而不是写入。会为其他人保持下去...

09-06 03:02
查看更多