if (-1 == fcntl(iSocketfd, F_SETFL, O_NONBLOCK))
{
printf("fcntl socket error!\n");
return -1;
}
int iSocketLen = sizeof(struct sockaddr_in);
/* set recvfrom from server timeout */
struct timeval tv;
fd_set readfds;
for(;;)
{
tv.tv_sec = TIME_OUT_TIME;
tv.tv_usec = 0;
FD_ZERO(&readfds);
FD_SET(iSocketfd, &readfds);
if (select(iSocketfd+1,&readfds,NULL, NULL, &tv) > 0)
{
iRecvNum = recvfrom(iSocketfd,(void *)stRecvBuf,sizeof(*(stRecvBuf)),0, (struct sockaddr *)stRemote,&iSocketLen);
if (-1 == iRecvNum)
{
printf("received data error!\n");
}
printf("iRecvNum is %d\n",iRecvNum);
}
else
{
printf("timeout!there is no data arrived!\n"); //return -1
}
}
本文详细介绍了使用socket进行非阻塞读取操作,并通过设置超时时间来避免长时间等待无响应数据的情况。通过设置fcntl函数为O_NONBLOCK模式,实现了高效的socket数据接收流程。
1480

被折叠的 条评论
为什么被折叠?



