Linux 网络select模型
来源:互联网 发布:linux创建多个定时器 编辑:程序博客网 时间:2024/06/05 10:22
#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;}
1 0
- Linux 网络select模型
- Linux select/epoll网络模型
- Linux网络编程select模型的实现
- linux网络编程之 select()的模型
- linux网络编程之 select()的模型
- linux网络编程 select,poll,epoll模型
- Linux网络编程select模型的实现
- linux c/c++网络编程----select模型
- Linux网络编程select模型的实现
- linux网络通信之concurrency模型select
- linux网络编程之select模型
- linux网络编程异步IO模型之—select模型 .
- 网络编程中select模型和poll模型学习(linux)
- 网络编程-select模型
- 网络基础 select模型
- 网络编程Select模型
- 网络通信模型 --select
- 网络编程 select模型
- SQL 序号列ROW_NUMBER,RANK,DENSE_RANK、NTILE
- LintCode:最小子串覆盖
- 判断是否存在拓扑结构相同的子树(C++版)
- Android中无法获取EditText中输入的值
- 日报2015/11/24(第一行代码读书笔记)
- Linux 网络select模型
- Java基础——Java笔记--内部类
- java 集合 实现comparable接口
- centos6.4安装ftp服务軟件vsftpd
- LintCode:最小差
- 朝花夕拾之--大数据平台CDH集群离线搭建
- c#中的DBNull和Null
- Java NIO 读取文件、写入文件、读取写入混合
- Androiod Input event