|
有个疑问,web server处理多客户端连接的时候,代码一般是这样的:
- server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
- server_address.sin_family = AF_INET;
- server_address.sin_addr.s_addr = htonl(INADDR_ANY);
- server_address.sin_port = htons(9734);
- server_len = sizeof(server_address);
- bind(server_sockfd, (struct sockaddr *)&server_address, server_len);
- listen(server_sockfd, 5);
- while(1) {
- char ch;
- printf("server waiting\n");
- /* Accept connection. */
- client_len = sizeof(client_address);
- client_sockfd = accept(server_sockfd,
- (struct sockaddr *)&client_address, &client_len);
- /* Fork to create a process for this client and perform a test to see
- whether we're the parent or the child. */
- if(fork() == 0) {
- /* If we're the child, we can now read/write to the client on client_sockfd.
- The five second delay is just for this demonstration. */
- read(client_sockfd, &ch, 1);
- sleep(5);
- ch++;
- write(client_sockfd, &ch, 1);
- close(client_sockfd);
- exit(0);
- }
- /* Otherwise, we must be the parent and our work for this client is finished. */
- else {
- close(client_sockfd);
- }
复制代码
我知道 socket处理多客户端时 需要fork多个子进程。准确的讲是 n个连接就是n个子进程 ,外加1个父进程 负责继续listen,所以共n+1 个进程。
那 这个socket呢? 对server来说,监听的socket和 传送数据的是同一个吗?还是 两个(一个listen的socket,一个 负责收发数据), 还是 n+1个socket?
我个人感觉应该是 1个啊。举个例子,我们访问web server一般都是80端口,不管你有多少个client去访问啊。
但是 上面代码进程要n+1个,但用同一个socket ,好像不合理啊。
|
|