荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: 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软件 网络书店