您的位置:首页 > 理论基础 > 计算机网络

linux网络编程之select

2016-06-12 16:16 363 查看
#include<stdio.h>

#include<sys/select.h>

#include<sys/types.h>

#include<sys/socket.h>

#include<netinet/in.h>

#include<unistd.h>

#include<stdlib.h>

void main()

{

struct sockaddr_in addr;

addr.sin_family = AF_INET;

addr.sin_addr.s_addr = inet_addr("127.0.0.1");

addr.sin_port = htons(3001);

int sock = socket(AF_INET,SOCK_STREAM,0);

if(-1==sock)

{

perror("socket error");

return;

}

printf("listen fd = %d\n",sock);

int reuse = 1;

setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse));

if(bind(sock,(struct sockaddr*)&addr,sizeof(addr))<0)

{

perror("bind error");

return;

}

listen(sock,5);

fd_set read_set;

fd_set write_set;

FD_ZERO(&read_set);

FD_ZERO(&write_set);

FD_SET(sock,&read_set);

int max = sock+1;

while(1)

{

fd_set temp_read_set;

fd_set temp_write_set;

memcpy(&temp_read_set,&read_set,sizeof(temp_read_set));

memcpy(&temp_write_set,&write_set,sizeof(temp_write_set));

struct timeval tv;

tv.tv_sec = 2;

tv.tv_usec = 0;

int ret = select(FD_SETSIZE,&temp_read_set,NULL,NULL,&tv);

if(ret==-1)

{

perror("select error");

break;

}

int i=0;

for(;i<FD_SETSIZE;++i)

{

char buf[100];

memset(buf,0,100);

if(FD_ISSET(i,&temp_read_set))

{

if(i==sock)

{

struct sockaddr_in client_addr;

int sockaddr_in_len = sizeof(client_addr);

int client_sock = accept(sock,(struct sockaddr*)&client_addr,&sockaddr_in_len);

FD_SET(client_sock,&read_set);

FD_SET(client_sock,&write_set);

printf("accept new conn");

if(client_sock>max-1)

{

max = client_sock + 1;

}

}

else

{

recv(i,buf,10,0);

printf("recv data: %s\n",buf);

}

}

else if(FD_ISSET(i,&temp_write_set))

{

}

}

}

int i=0;

for(;i<FD_SETSIZE;++i)

{

if(FD_ISSET(i,&read_set))

{

close(i);

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: