【发布时间】:2010-09-25 11:28:10
【问题描述】:
我想在 MacOS 机器上用 C 语言编写我自己的小型聊天服务器。现在我想连接到所有在线并打开连接的客户端,以便能够接收和发送消息。问题是我只知道如何一次打开一个套接字连接。所以到目前为止只有一个客户可以连接,这样聊天有点无聊;)
【问题讨论】:
标签: c multithreading unix networking
我想在 MacOS 机器上用 C 语言编写我自己的小型聊天服务器。现在我想连接到所有在线并打开连接的客户端,以便能够接收和发送消息。问题是我只知道如何一次打开一个套接字连接。所以到目前为止只有一个客户可以连接,这样聊天有点无聊;)
【问题讨论】:
标签: c multithreading unix networking
对于小型聊天服务器,最简单的解决方案可能是使用 select() 或 pselect()。
看看优秀的Beej's Guide to Network Programming。在他的select() tutorial 中,他构建了一个小型聊天服务器。
【讨论】:
由于 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
}
【讨论】:
我自己从来没有使用过它们,但我怀疑它们是为了你想做的事情。
【讨论】: