@select()函数经典错误

select()函数经典错误

最近调试一个板载WiFi模块,需要进行UDP通信,怎么调试都会出现 ***select fail:Invalid argument*** 这样的错误,查看代码又感觉没有什么问题,然后注意调试,最终发现,是 *struct timeval timeout;//定义slect超时结构体* 未进行初始化造成的。 由于函数 int select(int nfds, fd_set* readset, fd_set* writeset, fe_set* exceptset, struct timeval* timeout) 需要调用到 struct timeval* timeou结构体,在函数内定义的该结构体,局部变量未初始化,导致timeou内时间随机,因此select报错,程序如下。


/**************************************************************************
* 函数名称: int udp_set_rcv( int sfd, const struct sockaddr *toAddr,fd_set *fds)
* 功能描述: 非阻塞接收recvfrom udp参数接口 用于板载WiFi发送set设置数据用
* 输入参数:  sfd:创建socket的udp通道值  toAddr:发送到的socket结构体 ,fds 文件描述符集合
* 输出参数:
* 返 回 值: iResult 成功返回发送的参数指令的长度,失败返回-1 ,具体错误查看errno , 超时返回-2,说明没有参数返回,或者无通信
* 其它说明:
* 修改日期    版本号    修改人          修改内容
* -----------------------------------------------
* 2022/03/02      V1.0       ZhaoChengJie          first commit
* 2022/03/03      V1.1       ZhaoChengJie         add memset(&timeout, 0,sizeof(timeout)); 函数,缺少该函数导致select()报错,经典错误**************************************************************************/
int udp_set_rcv( int sfd, const struct sockaddr *toAddr )
{struct sockaddr_in *pT_RcvAddr = (struct sockaddr_in *)toAddr ;int iResult=0;int iRcvAddrLen = 0 ;int iWatchDogTime = 0;char cMsg[1024] = {0};struct timeval timeout;//定义slect超时结构体fd_set fds; //定义一个文件描述符集合memset(&timeout, 0,sizeof(timeout));  //由于此处最开始未初始化,导致select()函数一直有问题!!!找了好久的bug!!!fuxkiRcvAddrLen = sizeof( struct sockaddr_in ) ;
#if PRINTF_ALL_PARAprintf("sfd=%d\n", sfd );
#endif//循环监视文件描述符集合while(1){iWatchDogTime ++ ;//看门狗timeout.tv_sec = MAX_BLOCK_TIME;
#if PRINTF_ALL_PARAprintf("iWatchDogTime=%d--tv_sec=%d--usec=%d\n", iWatchDogTime, timeout.tv_sec, timeout.tv_usec);
#endifif( iWatchDogTime > MAX_WATCHDOG_TIME ){printf("dead loop socket , communication failure\n" );return -2;//通信未成功}FD_ZERO(&fds);//清空文件描述符集合FD_SET( sfd, &fds); //把网络通信文件描述符加入到集合中iResult = select(sfd+1,&fds,NULL,NULL,&timeout);//阻塞等待,直到集合中有活跃的描述符
#if PRINTF_ALL_PARAprintf(" iResult select = %d\n", iResult );
#endifif(iResult < 0)//错误{perror(" select fail:");//close(sfd);return -1;}/*else if(iResult == 0)//超时{perror("(nvram_set_SSID)select over time:");close(sfd);}*/else if(iResult > 0)  //有活跃的  ret为1{#if PRINTF_ALL_PARAprintf(" rcv new data\n" );
#endifif(FD_ISSET(sfd,  &fds))//判断是否是new_socket_fd活跃,(有消息收到){iResult = recvfrom(sfd, cMsg, sizeof(cMsg), 0, (struct sockaddr *)pT_RcvAddr, &iRcvAddrLen );//接收回来的信息和IP信息if(iResult == -1){printf(" RecvData result=%d--%s\n", iResult, strerror ( errno )  );return iResult;}printf(" [%s:%d]",inet_ntoa(pT_RcvAddr->sin_addr),ntohs(pT_RcvAddr->sin_port));//打印消息发送方的ip与端口号printf("msg=%s\n",cMsg  );return iResult;}}memset(cMsg, 0, sizeof(cMsg));//清空存留消息sleep(1);}
}

select()函数经典错误相关推荐

  1. C语言中select函数简介及使用

    select函数用来检查套接字描述符(sockets descriptors)是否已准备好读/写,提供了一种同时检查多个套接字的方法. Linux中select函数的声明在/usr/include/x ...

  2. oracle向前推一个小时,oracle SQL里常用的时间函数,经典推荐

    oracle SQL里常用的时间函数,经典推荐 (2009-03-11 23:16:54) 标签: 杂谈 常用日期型函数 1.Sysdate 当前日期和时间 SQL> Select sysdat ...

  3. 初学rpa的十大经典错误及解决办法_Python3之十大经典错误及其解决办法

    作者 | 严小样儿 来源 | 统计与数据分析实战 接触了很多Python爱好者,有初学者,亦有转行人.不论大家学习Python的目的是什么,总之,学习Python前期写出来的代码不报错就是极好的.下面 ...

  4. socket通信时如何判断当前连接是否断开--select函数,心跳线程,QsocketNotifier监控socket...

    client与server建立socket连接之后,如果突然关闭server,此时,如果不在客户端close(socket_fd),会有不好的影响: QsocketNotifier监控socket的槽 ...

  5. UNIX中的Select函数

    表头文件 #i nclude<sys/time.h> #i nclude<sys/types.h> #i nclude<unistd.h> 定义函数 int sel ...

  6. select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET(转)

    select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供select函数来实现多路复用输入/输出模型, 原型: int select(int maxfd,fd_set *rds ...

  7. linux 下 select 函数的用法

    一.Select 函数详细介绍 Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect. accept.recv ...

  8. SOCKET编程中,select()函数的作用

    SOCKET编程中,select()函数的作用Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect.accep ...

  9. MySQL数据库“十宗罪”(十大经典错误案例)

    各位技术老铁们,福利来了!今天给大家说说<数据库中十大经典错误案例> 老张我在刚开始学习数据库的时候,没少走弯路.经常会遇到各种稀奇古怪的 error 信息,遇到报错会很慌张,急需一个解决 ...

最新文章

  1. 安全设置Windows组策略 有效阻止黑客
  2. PL/SQL不能导入备份文件如何解决
  3. BenchmarkDotNet的使用
  4. 007_JavaScript关键字和保留字
  5. Ubuntu18.04安装VMware WorkStation
  6. g11 android 4.4,HTC G11 Incredible S 稳定流畅Android4.0.4华丽体验Sense4.1 省电耐用
  7. Acticity切换时ScrollView不停留原位置,自动滚动其他位置
  8. Linux网络编程 | 信号 :信号函数、信号集、统一事件源 、网络编程相关信号
  9. 设置图片元素上下垂直居中的7种css样式_赵一鸣博客
  10. mysql 关联更新_跳出初学MySQL知识的原理整理(一)
  11. mongodb php update,MongoDB文档的更新(php代码实例)
  12. Theano 中文文档 0.9 - 7.2.4 条件
  13. 据说,80%的人没有真正理解了Spring的依赖注入
  14. 图像形态学运算之图像开闭运算 含python实现
  15. php对用户输入的非标准格式日期匹配
  16. 虚拟光驱DAEMONTools 3.47特别版/汇编版/珍藏版
  17. git 创建邮箱 用户名_初次安装git配置用户名和邮箱及密钥
  18. java愤怒的小鸟教学_JAVA课程设计——愤怒的小鸟(团队)
  19. 008 使用MyBatis,easyUI实现CRUD操作样例-CUD(CRUD完毕)
  20. Mac下用docker安装阿波罗Apollo

热门文章

  1. mysql建立数据浏览器_一个简单的MySQL数据浏览器_php
  2. echarts数据格式化处理
  3. 函数周期表丨时间丨值丨WEEKDAYWEEKNUM
  4. 上网网速慢怎么办?半分钟搞定
  5. 关闭linux服务器电源,什么关机命令使Linux能自动关闭电源
  6. tensorflow学习--sess.run()
  7. tensorflow中sess.run执行原理及常见问题
  8. 程序员如何坚持学计算机英语
  9. 僵尸网络攻击:从DDoS到“蜂巢网络”和“性勒索”
  10. python文件闪退_python运行窗口闪退(python打开文件出现闪退什么原因)