我想在MacOS机器上用C编写自己的小聊天服务器。现在我想连接到所有在线客户端并打开连接,以便能够接收和发送消息。问题是我只知道,如何一次打开一个套接字连接。所以到目前为止只有一个客户可以连接,而且这样的聊天有点无聊;)
答案 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)
我从来没有把它们用在我自己身上,但我怀疑它们是为了你想做的事。
答案 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
}