我已经为TCP服务器编写了C代码,一次只能听一个客户端..但是我很难弄清楚如何让服务器同时收听多个客户端。
有没有人知道一个好的教程或解释这个的例子?
谢谢!
答案 0 :(得分:2)
有很多方法可以实现这一目标,其中一些方法是:
select
基本上等待一组文件描述符,直到其中一个文件描述符准备好进行读写。pthreads
)将单个会话切换为单个进程内的线程。fork
复制处理会话的进程,以便分叉进程处理该会话,原始进程返回等待更多连接。其中,我更喜欢中间的。分叉进程有时是一项昂贵的操作,因为如果任何一个进程尝试更改数据,通常必须复制数据。
select
选项意味着您的代码必须管理多个会话,并且有时会变得混乱。
使用线程,您可以相对轻松地将会话彼此分开,而不会产生进程重复的成本。当然,如果您不小心,线程有其自身的缺陷,但一旦您了解潜在的问题区域,我认为它是一个更好的选择。
答案 1 :(得分:2)
看看libevent。它为几种流行的高可扩展性服务器应用程序提供支持。
答案 2 :(得分:2)
结帐http://www.zeromq.org/ 这是一个非常酷的网络(或消息传递)库,可以从代码中取出“选择”或传统的套接字。
答案 3 :(得分:1)
你在哪个平台上?如果是Windows,则流行的平台API为WaitForMultipleObjectsEx。如果是Linux,那么从较低级别到较高级别的流行选择可能是select
(如约书亚所述),epoll
,kqueue
或libevent
/ {{1} (类似但略有不同的库,其中包括前面API的抽象层)。
libev
非常便携,但在大多数情况下并不是最佳的(自创建以来已经学到了很多东西)。尽管如此,如果你不需要疯狂的表现并且想要坚持相当标准的C编程,它将是一个很好的选择,并且有大量的文献提到它。一旦您的服务器使用select,就不应该将其更改为更高级的多路复用API。
答案 4 :(得分:0)
见男2选择
这应该做你想要的。当心,未经测试:
listen_any(int n, int *s, void receiver(int *))
{
FD_SET set;
int x = -1;
int i;
for (i = 0; i < n; ++i)
if (x < s[i]) x= s[i];
while (1) {
FD_ZERO(&set);
for (i = 0; i < n; ++i)
FD_SET(s[i], fd);
select(x, &set, NULL, NULL, NULL);
for (i = 0; i < n; ++i)
if (FD_ISSET(s[i], fd)) {
struct socakddr sa;
int len = sizeof(sa);
int sn = accept(s[i], &sa, &len);
if (sn >= 0) {
if (!receiver(sn))
close(sn);
}
}
}
}
答案 5 :(得分:0)
只需在上一个侦听器创建另一个侦听器
答案 6 :(得分:-3)
不知道它与此有什么关系,但......可以使用以下变体:
listener.Start()
While True
Dim user As New chatclient(listener.AcceptTcpClient)
End While