TCP--server升级版

14 篇文章 0 订阅

前面已经编写完基本的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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值