第一问:
在UNP(UNIX网络编程第1卷--中文版)书上的第46页说明了并发TCP服务器的工作流程,但fork()出来的子进程端口号和父进程端口号相同(书上的ftp服务器都是21)。
在UNP(UNIX网络编程第1卷--中文版)书上的第525页说明了并发UDP服务器的工作流程,但fork()出来的子进程端口号和父进程端口号不同。
那他们(子进程和客户端)分别是怎么通信的呢?
并发UDP服务器的工作流程,我看了下tftp-hpa-0.40.tar.gz的源码,确实是如UNP(UNIX网络编程第1卷--中文版)书上的第525页所说。fork()子进程,在子进程中socket()生出新端口,bind()绑定新端口,connect()与客户端通信。
并发TCP服务器的工作流程,我看了下linux-ftpd-0.17.tar.gz的源码,它也是fork()出子进程来处理链接,与上一条基本相同,与UNP(UNIX网络编程第1卷--中文版)书上的第46页所说基本相同。
但就并发TCP服务器策略而言,有很多,在这介绍一下:
1.迭代服务器(最基础原始的)for(;;)或while(1)。
2.为每个用户fork()一个进程,就如上面的FTP服务器采用的策略。
3.预先派生子进程服务器程序,每个子进程各自accept()。
4.为每个用户pthread_create()一个线程,每个线程用已连接的套接口和客户端通信。
5.预先创建线程服务器程序,每个线程各自accept()。
6.预先创建线程服务器程序,主线程统一accept()。
解答完毕!
第二问:
在TCP中,可以用socket(), bind(), listen()建立一个sock_fd用于监听,当收到客户端的信息后调用accept()又可以产生新的套接口号,我们暂叫它new_sock_fd,以区别于先前用于监听的sock_fd。当用户大量多时就形成了并发。于是就产生了许多new_sock_fd。我们可以用I/O复用如:select()等对这些套接口进行管理。
在UDP中,可以用socket(), bind(), 建立一个sock_fd用于监听,但不能产生新的套接口。当用户大量多时就形成了并发,我们怎么处理这些并发呢?我看到也有用I/O复用的如:select(),但它是怎么产生这么多新套接口的呢?
解答:UDP服务器只能走并发UDP服务器的工作流程(fork()子进程,第一问中解释过了),所以不存在UDP服务器用select()的情况,即不适用!
解答完毕!