荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: aclaire.bbs@bbs.sjtu.edu.cn (aaa), 信区: Linux
标 题: unix下应付大量client连接的服务器程序的一点构思
发信站: 饮水思源 (Tue Mar 22 10:36:27 2005)
转信站: SZU!news.szu.edu.cn!bbsnews.sdu.edu.cn!SJTU
下面是我对UNIX下面构建并发服务器一点构思,不知是否可行,欢迎大家指点一下幼稚
之处:
父进程调用accept,连接建立后accept返回,服务器然后调用fork,这样已连接套
接字在父子进程间共享,接下来就是子进程读写已连接的套接字,父进程则关闭已
连接套接字,继续等待另一个客户连接。典型代码:
pid_t pid;
int listenfd, connfd;
listenfd = socket(...);
bind(listenfd, ...);
listen(listenfd, ...);
for (; ;)
{
connfd = accept(listenfd, ...);
if ((pid = fork()) == 0) // child
{
close(listenfd); // child close listening socket
doit(connfd); // child process the client request
close(connfd); // done with the client
exit(0);
}
close(connfd); // parent close connected socket
}
自己的一点想法:在unix下面习惯用多进程,但觉得进程代价总是大了点,如果有
大量的客户和服务器相连,要是为每个客户都fork一个进程的话,是否代价太大(
即使用线程,我觉得也有这个问题)?所以,我觉得用多进程/线程结合select的做
法是构建大型服务器的最好方法!具体做法是:让每个进程/线程管理多个客户连接
socket,然后这些同一进程/线程内的socket用select来管理。类似代码为:
void doit(int connfd)
{
while (select(…) != -1) // 同时等待多个socket
{
// 根据结果判断哪些socket有数据可以读写,然后对这些socket进
行读写
}
}
--
--
※ 来源:·饮水思源 bbs.sjtu.edu.cn·[FROM: 210.22.124.6]
[回到开始]
[上一篇][下一篇]
荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店