TCP--server升级版

来源:互联网 发布:qq农场蜂箱升级数据 编辑:程序博客网 时间:2024/06/05 16:28

前面已经编写完基本的TCP服务器和客户端了;现在要对服务器做一个改进版本的,前面的服务器,其实只支持一个访问,因为当我们监听到一个程序的时候,本进程只能服务其一个socket;
现在来写一个支持多用户访问的,其中有好几个方法,可以来支持多用户访问;

  1. 可以使用多进程,每当监听到一个请求时,就创建一个进程来让子进程去为他服务;这样就可以再去监听下一个请求了;
 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描述符。
setsockopt

opt

这个样子就好了,如果是服务器挂掉也可以立即重启了;

原创粉丝点击