Linux 网络select模型
2015-11-24 23:16
609 查看
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <fcntl.h> #include <netdb.h> #include <pthread.h> #define DEF_STD_ERROR (-1) #define DEF_BIND_PORT (12455) #ifndef TRUE #define TRUE 1 #define FALSE 0 #define BOOL int #endif //set socket(TRUE:block, FALSE:no block) void set_block(int sock,BOOL flag) { int ret; if(flag == TRUE) { ret = fcntl(sock,F_GETFL); ret ^= O_NONBLOCK; fcntl(sock,F_SETFL,ret); } else { ret = fcntl(sock,F_GETFL); ret |= O_NONBLOCK; fcntl(sock,F_SETFL,ret); } } //thread param struct thread_param { fd_set my_set; int my_count; int my_max; pthread_mutex_t my_mutex; }; void * deal_thread(void *param) { struct thread_param *p=(struct thread_param*)param; fd_set read_set; int ret; int i; struct timeval my_tv; my_tv.tv_sec = 0; my_tv.tv_usec = 10; while(1) { //clear FD_ZERO(&read_set); //fill memcpy(&read_set,&p->my_set,sizeof(read_set)); //select ret = select(p->my_max+1,&read_set,NULL,NULL,&my_tv); //judge if(ret < 0) { printf("%s",strerror(errno)); break; } else if(ret == 0)//chao shi { usleep(10); continue; } //check for(i = p->my_max;i>2;i--) { if(FD_ISSET(i,&read_set)>0) { //recv printf("sock[%d]:\n",i); sleep(1); } } } } int main(int argc,char *argv[]) { int ret; int sock; struct sockaddr_in addr; pid_t child; char buf[1024]; int len; pthread_t thread; fd_set read_set; struct thread_param param; param.my_count = 0; param.my_max = 2; FD_ZERO(¶m.my_set); pthread_mutex_init(¶m.my_mutex,NULL); //create socket sock = socket(AF_INET,SOCK_STREAM,0); if(sock == DEF_STD_ERROR) { printf("%s",strerror(errno)); return -1; } //init address addr.sin_family = AF_INET; addr.sin_port = htons(DEF_BIND_PORT); addr.sin_addr.s_addr = inet_addr("192.168.1.127"); ret = bind(sock,(struct sockaddr*)&addr,sizeof(addr)); if(ret == DEF_STD_ERROR) { printf("%s",strerror(errno)); close(sock); return -1; } //listen ret = listen(sock,5); if(ret == DEF_STD_ERROR) { printf("%s",strerror(errno)); close(sock); return -1; } //set no block set_block(sock,FALSE); //accept while(1) { ret = accept(sock,NULL,NULL); if(ret == DEF_STD_ERROR) { if(errno == EAGAIN) { //printf("yi bu...\n"); usleep(10); continue; } else { printf("%s",strerror(errno)); break; } } param.my_max = param.my_max > ret ? param.my_max:ret; //add to read_set pthread_mutex_lock(¶m.my_mutex); if(param.my_count < 1024) { FD_SET(ret,¶m.my_set); param.my_count++; } //if is first ,create thread if(param.my_count == 1) { pthread_create(&thread,NULL,deal_thread,¶m); } pthread_mutex_unlock(¶m.my_mutex); } //wait child thread pthread_join(thread,NULL);//WaitForSignalObject //pthread_mutex_destory(¶m.my_mutex); //close close(sock); return 0; }
相关文章推荐
- Linux网络poll模型
- 入门网络安全第一天
- http://macrochen.iteye.com/blog/1414568
- [连载]《C#通讯(串口和网络)框架的设计与实现》-3.设备驱动的设计
- Webpack 转自http://segmentfault.com/a/1190000002551952
- Vue.js 转自http://zhuanlan.zhihu.com/evanyou/20302927
- sudo tcp_wrappe
- Github: 团队账号:https://github.com/ChenRuTing
- 各大网络请求框架的比较
- iOS_NSURLSessionDownloadTask_显示加载进度_断点续传(网络中断情况).
- 如何用 fiddler 捕获 https 请求
- Tcp 断开连接(重要)
- Unix网络编程(卷1)—笔记
- iOS数据库离线缓存思路和网络层封装
- 图解TCP/IP读书笔记(二)
- 加载网络图片的框架总结
- 神经网络的基本原理及编程入门
- TCP洪水攻击(SYN Flood)的诊断和处理
- HTTP学习笔记(1)ULR语法
- http://www.runoob.com/