微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在为 UDP 通信调用 recvfrom( ) 函数后获取“检测到 *** 缓冲区溢出 ***:终止中止”

如何解决在为 UDP 通信调用 recvfrom( ) 函数后获取“检测到 *** 缓冲区溢出 ***:终止中止”

每当我在服务器端为 UDP 调用 recvfrom() 函数时,我都会遇到错误

检测到缓冲区溢出***:已终止中止

这个错误是什么意思?我无法理解。

unsigned int len;
int rv,i;
int tmp;
//char msg[200],command=0;
unsigned short *Fptr;
float Float_Temp;
//make socket blocking
FD_ZERO(&readnbs);
FD_SET(g_iUDP_datalogger_soc,&readnbs);
g_UDP_Blocktimervalue.tv_sec = 0;
g_UDP_Blocktimervalue.tv_usec = UDP_REC_BLOCKTIME;
rv = select(g_iUDP_datalogger_soc + 1,&readnbs,NULL,&g_UDP_Blocktimervalue);

len = sizeof(g_UDP_ClientAddr);

if (rv == 1) {

    printf(" \n\n\n\n\n rv=%d\n\n\n\n",rv);
    tmp = recvfrom(g_iUDP_datalogger_soc,&tmp,SIZE_UDP_MSG,(struct sockaddr *) &g_UDP_ClientAddr,&len);

解决方法

tmp = recvfrom(g_iUDP_datalogger_soc,[YOUR BUFFER ?],SIZE_UDP_MSG,(struct sockaddr *)...

您正在尝试将接收到的数据缓冲到单个 int (tmp) 对象中,您也将其用作 recvfrom() 的返回值,甚至不以任何方式检查 -无论是错误还是接收到的数据。

,

您要求 recvfrom()SIZE_UDP_MSG 个字节读入 tmp,这是一个 int。您没有说明 SIZE_UDP_MSG 的定义是什么,但是如果 SIZE_UDP_MSG > sizeof(int),您将超出 tmp 边界的字节写入周围的内存,从而破坏内存。那是缓冲区溢出。

也许您打算将字节接收到(注释掉的)msg 缓冲区中?

char msg[SIZE_UDP_MSG];
tmp = recvfrom(...,msg,...);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。