C中的聊天服务器 - 客户端使用线程或进程?

时间:2011-11-19 15:01:05

标签: c multithreading chat

首先,我正在处理的环境是Windows 7和Visual Studio 2010

我已经编写了一个使用select方法从多个客户端检索数据的服务器。

我还通过运行(client.exe localhost 4444 Peter)编写了一个连接到上面服务器的客户端。 “Peter”是此用户想要使用的用户名。

现在假设我们在服务器上连接了两个用户。他们每个人都能够运行命令/help。这将返回用户可以使用的其他一些命令。其中一个命令是/listusr,它返回服务器上的所有用户。

另一个命令是/talk2,这是我的问题所在的地方。我想让用户选择其他用户想要聊天。例如,如果你想和彼得谈谈,你可以/talk2 Peter

我将如何开始这样的活动?服务器如何将消息从我发送给Peter(我必须在此处添加,当新用户连接时,服务器将他/她的用户名和他/她的套接字号保存在结构中)?

我是否需要为每个对话或新进程创建新线程?有人可以给我一些暗示或建议继续我的项目吗?我现在对如何管理感到困惑。

3 个答案:

答案 0 :(得分:2)

都不是。您的服务器应该维护某种类型的数据结构,该结构将用户ID与客户端套接字句柄相匹配。当请求带有/talk2命令时,服务器应该查找该用户标识的相应套接字句柄,并且应该使用send()中继该消息。

答案 1 :(得分:1)

可扩展的方式是你的服务器负责告诉两个客户端另一方的IP地址,然后彼得和你建立连接以便你可以说话。

如果您真的想让服务器转移会话,您需要考虑以下因素以获得更好的可扩展性:

  • 使用UDP代替TCP
  • 使用线程代替进程

答案 2 :(得分:0)

  • 如果一次交互的用户数量很多,则产生新进程将是服务器的折磨。但另一方面,编码会更简单。
  • 线程确实提供了可伸缩性,但是在代码中你必须格外小心,不要做任何愚蠢的事情。 (例如,向错误的人发送错误的聊天。)
  • 使用select / poll技术(我不确定它们在Windows环境中的表现如何,但它对Linux很有用。)
  • UDP会减少传输时间,但我不太确定这是不是一个好主意。既然你说你已经有了代码,那么切换到UDP会很痛苦。
  • 只需发送所需客户端的地址也是一个可行的想法。它减少了服务器的大量工作,但现在您需要专门的客户端。

尝试每一个并检查哪一个最适合您。这是一个设计问题,因此不可能有一个硬性和快速的解决方案。这取决于您的应用程序的用途。您可能还想使用(可能是您已经在使用)sendto和recvfrom函数。