TCP服务器在C中一次监听多个客户端

时间:2010-10-14 02:30:59

标签: c tcp

我已经为TCP服务器编写了C代码,一次只能听一个客户端..但是我很难弄清楚如何让服务器同时收听多个客户端。

有没有人知道一个好的教程或解释这个的例子?

谢谢!

7 个答案:

答案 0 :(得分:2)

有很多方法可以实现这一目标,其中一些方法是:

  • 使用select基本上等待一组文件描述符,直到其中一个文件描述符准备好进行读写。
  • 使用线程(例如pthreads)将单个会话切换为单个进程内的线程。
  • 使用fork复制处理会话的进程,以便分叉进程处理该会话,原始进程返回等待更多连接。

其中,我更喜欢中间的。分叉进程有时是一项昂贵的操作,因为如果任何一个进程尝试更改数据,通常必须复制数据。

select选项意味着您的代码必须管理多个会话,并且有时会变得混乱。

使用线程,您可以相对轻松地将会话彼此分开,而不会产生进程重复的成本。当然,如果您不小心,线程有其自身的缺陷,但一旦您了解潜在的问题区域,我认为它是一个更好的选择。

答案 1 :(得分:2)

看看libevent。它为几种流行的高可扩展性服务器应用程序提供支持。

答案 2 :(得分:2)

结帐http://www.zeromq.org/ 这是一个非常酷的网络(或消息传递)库,可以从代码中取出“选择”或传统的套接字。

答案 3 :(得分:1)

你在哪个平台上?如果是Windows,则流行的平台API为WaitForMultipleObjectsEx。如果是Linux,那么从较低级别到较高级别的流行选择可能是select(如约书亚所述),epollkqueuelibevent / {{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