23,120
社区成员
发帖
与我相关
我的任务
分享
int recv_data(int sockfd)
{
fd_set r_set;
while(1)
{
FD_ZERO(&r_set);
FD_SET(sockfd, &r_set);
if(select(sockfd + 1, &r_set, NULL, NULL, NULL) == -1)
err_sys("select error \n");
// 当我描述的问题出现时,可以执行到这里,可是下面有时判断失败
if(FD_ISSET(sockfd, &r_set))
{
// do something
}
}
return 1;
}
int function()
{
//父进程中
int sockfd = 0;
int SNDBUF = 204800; //发送缓冲区
int RCVBUF = 204800; //接收缓冲区
if ((sockfd = socket(AF_INET, SOCK_PACKET, htons(ETH_P_ALL))) == -1)
printmsg("create socket error");
int flags = fcntl(sockfd, F_GETFL, 0);
fcntl(sockfd, F_SETFL, flags | O_NONBLOCK); //非阻塞
if (setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &SNDBUF, sizeof(SNDBUF)) == -1)
printmsg ("setsockopt error\n");
setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &RCVBUF, sizeof(RCVBUF));
//............一些其他的操作
while(1)
{
if(数据未读取)
{
//do something
continue;
}
if(接收数据)
{
recv_data(sockfd);
}
}
printmsg("function is over.....\n");
return 0;
}
sockfd = 5; //如果sockfd的值等于5
//那么FD_ISSET判断成功时,r_set.__fds_bits[5]的值是不是应该为 1
ret = select(sockfd + 1, &r_set, &w_set, NULL, NULL);
if(ret == -1)
{
}
else if(ret == 0){
}
else{
printmsg("select ok !\n");//确定select成功了返回了
}
int recv_data(int sockfd)
{
fd_set r_set;
struct timeval tv;
while(1)
{
FD_ZERO(&r_set);
FD_SET(sockfd, &r_set);
tv.tv_sec = 3; //如果问题出现了,这里时间无论我设置的大一些或者小一些,下面会一直超时
tv.tv_usec = 0;
int ret = select(sockfd + 1, &r_set, NULL, NULL, &tv);
if( ret == -1){
perror("select");
break;
}else if(ret == 0)
{
printmsg("Timeout!\n");
continue;
}
if(FD_ISSET(sockfd, &r_set))
{
// do something
}
}
return 1;
}
int recv_data(int sockfd)
{
printmsg("I'm in recv_data Funtion !\n"); //当我描述的问题出现时,只输出了这句打印,下面的select判断出错信息都没有输出,可见执行到这里时select判断没有问题,但是为什么有时FD_ISSET却判断失败?
fd_set r_set;
while(1)
{
FD_ZERO(&r_set);
FD_SET(sockfd, &r_set);
if(select(sockfd + 1, &r_set, &w_set, NULL, NULL) == -1){
perror("select");
break;
}else if(select(sockfd + 1, &r_set, &w_set, NULL, NULL) == 0)
{
printmsg("Timeout !\n");
continue;
}
if(FD_ISSET(sockfd, &r_set))
{
printmsg("recv data packet...\n"); //回复6楼,通过这句打印信息来判断的
// do something
}
}
return 1;
}