English 中文(简体)
我怎样可以让我的服务器同时向多个客户端保持开放连接?
原标题:
  • 时间:2008-12-05 06:54:57
  •  标签:

我想在MacOS机器上用C语言编写自己的小型聊天服务器。现在我想连接所有在线的客户端,并保持连接打开,以便能够接收和发送消息。问题在于我只知道如何同时打开一个套接字连接。迄今只有一个客户端可以连接,这样聊天有点无聊 ;)

最佳回答

一个小型聊天服务器的最简单解决方案可能是使用select()或pselect()。

看看优秀的Beej的网络编程指南。在他的select()教程中,他构建了一个小型的聊天服务器。

问题回答

一种选项是使用多线程与 pthreads 库。另一种选项是使用异步 I/O 与 select(2) 调用。使用 select(2),你打开了一堆套接字,然后可以轮询每个套接字看是否有数据。如果它有数据,你就读取它,否则你就移动到下一个套接字。

自从Mac OS X基于FreeBSD,为了获得最佳和最有效的程序,您应该使用kqueue

基本上,您需要在所选端口上拥有一个侦听套接字。一旦连接到侦听套接字,您需要在不同的端口号上打开一个新的套接字,并将客户端移交给这个新套接字。最好尝试使用预先编写的套接字库,因为在此处自己编写会是一个复杂的过程。

尝试搜索一些示例库 http://sourceforge.net

在一个程序中有多个连接的socket是没有问题的,而且你不需要纠缠于多线程。只需像以前一样保持打开连接。如果所有客户端都连接到同一个监听器,则在 accept()之后不要关闭监听器——它将继续等待更多的传入连接。

使用select()poll()来检查所有打开的套接字上是否有传入数据。不要忘记将监听套接字包含在select()描述符列表中-传入连接是select()检测的事件。

这真的非常简单,不需要火箭科学。

你也可以使用 fork-on-accept,像这样:

int listen_fd, new_fd;

while ((new_fd = accept(listen_fd, NULL, NULL)) != -1) {
    if (fork())
        close(new_fd);
    else
        // handle client connection
}

请查看函数。

我自己从未使用过它们,但我怀疑它们是你想要做的。





相关问题
热门标签