select并发求解
socket(…);bind(…);listen(…);while(1){accept(…);if(fork(..)==0){while(1)//????{read(…);process(…);write(…);}close(…);exit(…);}close(…);}int main(){ int listenfd,connfd; pid_t pid; struct sockaddr_in server; struct sockaddr_in client; int len; if((listenfd=socket(AF_INET,SOCK_STREAM,0))==-1) { perror("Creating socket failed"); exit(1); } int opt=SO_REUSEADDR; setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt)); bzero(&server,sizeof(server)); server.sin_family=AF_INET; server.sin_port=htons(PORT); server.sin_addr.s_addr=htonl(INADDR_ANY); if(bind(listenfd,(struct sockaddr *)&server,sizeof(server))==-1) { perror("Bind() failed"); exit(1); } if(listen(listenfd,BACKLOG)==-1) { perror("listen failed"); exit(1); } len=sizeof(client); while(1) { if((connfd=accept(listenfd,(struct sockaddr *)&client,(socklen_t *)&len))==-1) { perror("accept() failed"); exit(1); } if((pid=fork())>0) { close(connfd); continue; } else if(pid==0) { close(listenfd); process_cli(connfd,client); exit(0); } else { printf("fork() failed"); exit(0); } } close(listenfd); return 0;}
[解决办法]
while(1)处是一个进程的问题了。当其有连接的时候,即accept后,产生一个新的进程来对其读写操作。fork是一个产生进程的函数,返回值为0的表示是子进程。
if(fork(..)==0){while(1)//????{read(…);process(…);write(…);}close(…);exit(…);}
[解决办法]
根据以前的一点记忆,简单回答下,供参考
1、在服务器端的Socket分为两种,一种是监听socket,一种是实际与客户端进行连接,数据传输的socket
2、监听socket是一直存在的,用于随时接收客户端的申请
3、实际数据传输的socket是在接收到客户端的连接请求后,服务器端调用accept函数时,会再创建一个socket,这个socket创建之后,它去跟客户端建立连接,进行通信
4、服务器端能创建多少个用于数据通信的socket,就表示这个服务器端能同时支持多少个连接
[解决办法]
UNIX环境高级编程+UNIX网络编程卷1,2,看完可以毕业。