在为 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,...);