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;}
原创粉丝点击