带select()的客户端 - 服务器聊天室

时间:2013-11-13 20:46:54

标签: c select client-server chat

我有一个在C中实现客户端 - 服务器聊天室的任务。我已经完成了大部分内容,但是在select()方面遇到了客户端问题。

当客户端连接到服务器时,除非用户实际向stdin输入内容,否则他不会发送任何内容。但是,他应仍然接收所有向所有用户广播或专门针对他的消息。

例如:

  1. C1,C2,C3连接和交谈
  2. C4连接,但什么也没说。 C1 / 2/3还在说话。
  3. C1 / 2/3没有看到关于C4的事情(除了他已经连接),但C4看到了C1 / 2/3连接后发送的所有消息。
  4. 所以从本质上讲,客户端应该在阅读时阻止但仍然收到消息(非常矛盾!)。我现在能想到的唯一方法是让客户端多线程,一个线程监听接收,另一个发送;或使用fork()

    我的问题如下:使用select()是否有更简单的方法来执行上述操作?如果我将stdin添加到我的write_fds并将stdin用于连接服务器的read_fds添加到我的select(),那么选择是否仍然可以解决问题我需要从两者中读取并将它们传递给FD_ISSET?由于TCP是全双工的,当读/写同时发生时,应该没有问题,对吗?

    我想基本上,我想要实现的是为我的所有客户提供简单的telnet会话。任何有关这方面的建议都会受到欢迎。

    修改

    我忽略了一些事情:我很清楚我可以使用select()来检查服务器是否发送了什么以及客户端是否发送了什么,但我认为没有办法让这些行为符合我的要求它来。也就是说,我发现在发送时“阻塞”时仍然无法接收某些内容 - 可能会向{{1}}添加一个定时器并定期轮询套接字和stdin?我会尝试并进一步编辑这篇文章,但同时欢迎任何建议。

0 个答案:

没有答案