【发布时间】:2015-04-20 08:23:57
【问题描述】:
我正在使用 C 创建一个聊天服务器/客户端,并且我正在使用 select() 来监控我的套接字。
程序分为3部分,服务器,查看客户端。和提交客户。提交客户端将套接字连接到服务器,当有文本要从客户端读取时,选择触发器需要读取它。如果是新的客户端连接,select 也会触发,这样我就可以接受连接并为客户端分配一个套接字。
我的问题在于查看客户端,它应该在可写时触发选择。但是,当有新连接时,select 不会做任何事情。This source 声称只有在它们已经连接时才会在 write-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 以监视读取。但是,新的查看客户端连接似乎不会触发任何事情。
【问题讨论】:
-
"This source' 根本没有这么说。它没有说 'only'。如果您在非阻塞模式下进行连接,则连接完成时也会触发可写性。I'我很难理解您的描述。请说明哪个组件拥有哪个套接字并在每个阶段调用
select()。