select socket
来源:互联网 发布:微软平板软件下载 编辑:程序博客网 时间:2024/06/05 13:29
#include <stdio.h>#include <fcntl.h>#include <sys/socket.h>#include <netinet/in.h>#include <string.h>#include <unistd.h>#include <stdlib.h>#include <arpa/inet.h>#include <sys/select.h>#include <sys/types.h>#define server_port 8000#define SIZE 100#define block 5int ServerBuildSockt(int port){ int sock_fd; struct sockaddr_in servaddr; if((sock_fd = socket(AF_INET,SOCK_STREAM,0)) == -1){ printf("socket error\n"); return -1; } memset(&servaddr,0,sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(port); if(bind(sock_fd,(struct sockaddr*)&servaddr,sizeof(servaddr)) == -1){ printf("bind error!\n"); return -1; } if(listen(sock_fd,block) == -1){ printf("listen error!"); return -1; } return sock_fd;}int main(){ //struct sockaddr_in servaddr,cliaddr; struct sockaddr_in cliaddr; socklen_t cliaddr_len; int sock_fd,new_fd; char buf[SIZE]; char buf_addr[SIZE]; int n,i = 0; int ret; sock_fd = ServerBuildSockt(server_port); printf("wating for connect..\n"); cliaddr_len = sizeof(cliaddr); fd_set fdr; struct timeval tv; int fd[block]; int count = 0; int maxfd = sock_fd; memset(fd,0,sizeof(fd)); while(1){ FD_ZERO(&fdr); FD_SET(sock_fd,&fdr); tv.tv_sec = 10; tv.tv_usec = 0; //add active connection to fd set for(i = 0; i < block; i++){ if(fd[i] != 0 ){ FD_SET(fd[i],&fdr); } } ret = select(maxfd + 1,&fdr,NULL,NULL,&tv); if(ret < 0){ printf("select error!\n"); break; } else if(ret == 0) continue; //check every fd in the set for(i = 0; i<count;i++){ if(FD_ISSET(fd[i],&fdr)){ memset(buf,0,SIZE); ret = recv(fd[i],buf,SIZE,0); if(ret <= 0){ printf("connect[%d] close!\n",i); close(fd[i]); FD_CLR(fd[i],&fdr); fd[i] = 0; } else{ printf("connect[%d] send : %s\n",i,buf); } } } if(FD_ISSET(sock_fd,&fdr)){ new_fd = accept(sock_fd,(struct sockaddr*)&cliaddr,&cliaddr_len); if(new_fd <= 0){ printf("accept error!\n"); continue; } if(count < block){ fd[count++] = new_fd; printf("new connection client[%d] %s:%d\n",count,inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port)); if(new_fd > sock_fd) maxfd = new_fd; } else{ printf("max connection arrive,exit\n"); send(new_fd,"bye",4,0); close(new_fd); break; } } } close(sock_fd); return 0;}
阅读全文
0 0
- socket select
- Socket Select
- Socket & Select
- Socket-Select
- Socket Select
- socket select
- socket --- select()
- socket select
- socket select
- select socket
- socket select代码
- socket select()用法
- Socket select的用法
- Socket编程之Select
- socket select()用法
- socket-select函数
- socket select()用法
- Socket select()用法
- Linux redis 配置文件
- 【UVA1335】Beijing Guards
- 在IE或者360浏览器的兼容模式下页面错乱
- nginx不转发http header问题解决
- rtos的核心原理简析
- select socket
- 秋招的一些知识整理
- JVM(8):JVM知识点总览-高级Java工程师面试必备
- WebView不能下载apk文件
- < 笔记 > DOM
- 在Linux下安装CVS服务
- phped5.9开发工具
- 在虚拟机上安装需要的APK
- python与django环境的搭建