【问题标题】:C: Using select() to write to new clientC: 使用 select() 写入新客户端
【发布时间】: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()

标签: c sockets unix select tcp


【解决方案1】:

发布后几秒钟,我找到了解决方案。当有新客户端时,都需要读取监听套接字。只有在接受连接后,新套接字才会被监视写入。侦听新连接的套接字显然需要从不写入中读取。将继续为其他人...

【讨论】:

  • 只有在之前的write 操作因EWOULDBLOCK 而失败时,或者由于某种原因这样做更容易时,才应该将套接字添加到写入select 集.
  • @DavidSchwartz 那么判断一个套接字何时准备好写入的正确方法是什么?还是 select 不是在这种情况下使用的最佳选择?
  • 当您需要判断套接字何时准备好写入时,使用select 很好。但在 send 失败并返回 EWOULDBLOCK 之前,您不需要知道套接字何时准备好写入。
猜你喜欢
  • 2013-10-04
  • 2010-11-07
  • 2016-12-08
  • 2015-09-05
  • 2023-03-13
  • 1970-01-01
  • 2018-02-07
  • 2012-01-30
  • 2021-11-30
相关资源
最近更新 更多