我有一个任务是在 C 中实现一个客户端-服务器聊天室。我已经完成了大部分工作,但在select()
.
当客户端连接到服务器时,除非用户实际向stdin
. 但是,他仍应收到所有向所有用户广播或专门针对他的消息。
前任。:
- C1、C2、C3 已连接并正在通话
- C4 连接,但什么也没说。C1/2/3 还在说话。
- C1/2/3 看不到关于 C4 的任何信息(除了他连接了),但 C4 看到了 C1/2/3 自连接后一直发送的所有消息。
所以本质上,客户端应该在阅读时阻塞但仍然接收消息(非常矛盾!)。我现在能想到的唯一方法是让客户端多线程,一个线程监听接收,另一个监听发送;或使用fork()
.
我的问题如下:有没有更简单的方法来完成上述操作select()
?如果我添加stdin
到 mywrite_fds
和两个stdin
用于连接服务器的套接字到 my read_fds
(因为我需要从两者中读取)并将它们传递给select()
?由于 TCP 是全双工的,所以当/如果读取和写入同时发生时应该没有问题,对吗?
我想基本上,我想要为我的所有客户实现一个简单的 telnet 会话。为此提出的任何建议都将受到欢迎。
编辑:
我没有提及的事情:我很清楚我可以FD_ISSET
用来检查服务器是否发送了一些东西以及客户端是否发送了一些东西,但我认为没有办法让它们按照我想要的方式运行。也就是说,我看不到在发送时“阻塞”时仍然接收到一些东西 - 也许添加一个计时器select()
并定期轮询套接字和标准输入?我将尝试这样做并进一步编辑这篇文章,但同时非常欢迎任何建议。