前面已经编写完基本的TCP服务器和客户端了;现在要对服务器做一个改进版本的,前面的服务器,其实只支持一个访问,因为当我们监听到一个程序的时候,本进程只能服务其一个socket;
现在来写一个支持多用户访问的,其中有好几个方法,可以来支持多用户访问;
- 可以使用多进程,每当监听到一个请求时,就创建一个进程来让子进程去为他服务;这样就可以再去监听下一个请求了;
53 int id = fork();
54 if(id < 0 )
55 {
56 printf("fork error!\n");
57 exit(5);
58 }
59 else if(id == 0)
60 {//子进程来处理
61
62 while(1)
63 {
64 int id = fork();
65 if(id > 0 )//偷懒行为,再创建一次,父进程退出,这样就成孤儿进程在处理,最后由init进程管理
66 {
67 exit(0);
68 }
69 char buf[1024];
70 ssize_t s = read(client_sock,buf,sizeof(buf));
71 if(s>0)
72 {
73 buf[s] = 0;
74 printf("client :# %s\n",buf);
75 }
76 else
77 {
78 printf("read down ..........break;");
79 break;
80 }
81 write(client_sock,buf,sizeof(buf)-1);
82 }
83 }
84 else
85 {
86
87 }
这个样子就实现了多进程的处理的;
2.同时也就有相应的多线程的版本,其实原理都是一样的,监听到了就拿出去创建一个新的线程来处理它就好了;
把处理请求逻辑拿出来封装为一个函数;
11 void* handlerRequest(void* arg)
12 {
13 int new_fd = (int)arg;
14 while(1)
15 {
16 char buf[1024];
17 ssize_t s= read(new_fd,buf,sizeof(buf)-1);
18 if(s > 0)
19 {
20 buf[s] = 0;
21 printf("client:%s\n",buf);
22 write(new_fd,buf,strlen(buf));
23 }
24 else
25 {
26 printf("read done....\n");
27 break;
28 }
29 }
30 }
然后再在接到请求的时候创建线程就好了;
75 pthread_t id;
76 pthread_create(&id,NULL,handlerRequest,(void*)client_sock);
77 pthread_detach(id);
这样就可以了;
这里还要研究一个问题就是,TCP连接中当我们最后申请断开的一方是要进入TIME_WAIT状态的,这个时候,如果是我们编写的代码的话,服务器自己断开的,再重启就要进入TIME_WAIT,这对现实中it公司可以大问题,服务器挂掉起不起来;
所以就有了一个解决方案,使⽤setsockopt()设置socket描述符的 选项SO_REUSEADDR为1,表⽰允许创建端⼜号相同但IP地址不同的多个socket描述符。
这个样子就好了,如果是服务器挂掉也可以立即重启了;