我想在MacOS机器上用C语言编写自己的小型聊天服务器。现在我想连接所有在线的客户端,并保持连接打开,以便能够接收和发送消息。问题在于我只知道如何同时打开一个套接字连接。迄今只有一个客户端可以连接,这样聊天有点无聊 ;)
我怎样可以让我的服务器同时向多个客户端保持开放连接?
原标题:
最佳回答
一个小型聊天服务器的最简单解决方案可能是使用select()或pselect()。
看看优秀的Beej的网络编程指南。在他的select()教程中,他构建了一个小型的聊天服务器。
问题回答
自从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
}
请查看
我自己从未使用过它们,但我怀疑它们是你想要做的。
相关问题
热门标签
- winforms
- combobox
- fogbugz
- java
- date
- internationalization
- asp.net
- iis
- url-rewriting
- urlrewriter
- c#
- enums
- ocaml
- haxe
- algorithm
- string
- viewstate
- .net
- c++
- c
- symbol-table
- mysql
- database
- postgresql
- licensing
- migration
- vb.net
- vb6
- declaration
- vb6-migration
- python
- psycopg2
- backup
- vmware
- virtualization
- gnu-screen
- authentication
- desktop
- excel
- xll
- cultureinfo
- regioninfo
- oracle
- client
- session
- download
- html
- virtual
- constructor
- scenarios
- perl
- full-text-search
- javascript
- ajax
- testing
- oop
- inheritance
- vim
- encapsulation
- information-hiding