代码片:
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>
好像没有这段代码,程序执行之后不能成功监听到发送来的数据。暂时也不知道为什么。