您的位置:首页 > 运维架构 > Linux

[linux C]使用select进行非阻塞socket通信

2015-02-03 14:20 232 查看
代码片:

fd_set save_fds;
int sockfd;
struct sockaddr_in serv_addr;  //my address
struct sockaddr_in client_addr;

if((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))== -1)
{
perror("socekt error");
return -1;
}
   serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(SERVERPORT);
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
bzero(&(serv_addr.sin_zero),8);

socklen_t sin_size = sizeof(struct sockaddr_in);

assert(bind(sockfd,(struct sockaddr *)&serv_addr, sizeof(struct sockaddr_in)) == 0);

FD_ZERO(&save_fds);
FD_SET(sockfd,&save_fds);
struct timeval timeout= {0,0}; //非阻塞就置0

while(1)
{
<span style="color:#FF0000;"> fd_set read_fds = save_fds;</span>
int result = select(sockfd + 1, &read_fds, 0, 0, &timeout);
if(result >0 )
{
if(FD_ISSET(sockfd,&read_fds))
{
bzero(revbuf,BUFSIZE);
int ret = recvfrom(sockfd, revbuf, BUFSIZE, 0, (struct sockaddr*) &client_addr, &sin_size);
if (ret > 0)
{

printf("receive buf is %s",revbuf);

}
}
}

sleep(1);
//.....

}


如果有多个待监听到sockfd,就将其通过

FD_SET(sockfd,&save_fds);


添加到描述符集合中;然后通过

FD_ISSET(sockfd,&read_fds)


判断哪个描述符可以读取。

注意:
<span style="color:#FF0000;">fd_set read_fds = save_fds;</span>


好像没有这段代码,程序执行之后不能成功监听到发送来的数据。暂时也不知道为什么。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: