TCP--server升级版
来源:互联网 发布:qq农场蜂箱升级数据 编辑:程序博客网 时间:2024/06/05 16:28
前面已经编写完基本的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描述符。
这个样子就好了,如果是服务器挂掉也可以立即重启了;
阅读全文
0 0
- TCP--server升级版
- Socket Server: TCP 多线程版
- TCP server
- TCP Server
- tcp-server
- TCP--server
- QVegas-一个升级版的TCP Vegas拥塞算法
- tcp/ip 程序改进版 server.h
- Node.Js Tcp 粘包处理框架升级版(带TCP通信demo)
- MS SQL Server 升级
- SQL Server全文升级
- SQL SERVER数据库升级
- zabbix-server升级
- tcp server in c
- java Tcp Client server
- Indy tcp server
- C++ TCP Server
- vc tcp server 源代码
- JavaScript上的各种函数声明
- 安卓数据存储之SharedPreferences存储
- JQuery中each()的使用方法说明
- leaflet延迟加载
- CentOS 7忘记root密码解决办法
- TCP--server升级版
- MongoDB的可视化工具
- android app缓存清理
- 您的安全性偏好设置仅允许安装来自 App Store 和被认可的开发者的应用
- jQuery的ajax
- 微信公众号js接口,实现图片的上传(拍照+本地相册)
- JavaWeb-实现多ip、异地 同时登录踢人下线
- eclipse+java+tomcat+maven 开发环境配置
- 第四部分:MapReduce 编程模型