如何让我的服务器同时与多个客户端建立连接?

时间:2008-12-05 06:54:58

标签: c multithreading unix networking

我想在MacOS机器上用C编写自己的小聊天服务器。现在我想连接到所有在线客户端并打开连接,以便能够接收和发送消息。问题是我只知道,如何一次打开一个套接字连接。所以到目前为止只有一个客户可以连接,而且这样的聊天有点无聊;)

7 个答案:

答案 0 :(得分:3)

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

看看优秀的Beej's Guide to Network Programming。在他的select() tutorial中,他构建了一个小型聊天服务器。

答案 1 :(得分:1)

一种选择是对pthreads库使用多线程。另一种选择是使用select(2)调用的异步I / O.使用select(2),您打开一堆套接字,然后您可以轮询每个套接字以查看它是否有数据。如果它有数据,则读取它,否则转到下一个套接字。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

基本上你需要在你选择的端口上有一个监听套接字。一旦与侦听套接字建立连接,您需要在不同的端口号上打开一个新套接字,并将客户端交给这个新套接字。最好尝试使用预先编写的套接字库,因为在这里滚动自己将是一个复杂的过程。

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

答案 4 :(得分:0)

查看select, pselectpoll

我从来没有把它们用在我自己身上,但我怀疑它们是为了你想做的事。

答案 5 :(得分:0)

在一个程序中有多个连接套接字没有问题,你不需要搞乱多线程。只需像以前一样保持打开连接即可。如果所有客户端都连接到同一个侦听器,则不要在accept()之后关闭侦听器 - 它将继续侦听更多传入连接。

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

这真的很简单。没有火箭科学。

答案 6 :(得分:0)

您也可以使用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
}