【问题标题】:Getting "*** buffer overflow detected ***: terminated Aborted" after calling recvfrom( ) function for UDP communication在调用 recvfrom( ) 函数进行 UDP 通信后,得到“检测到 *** 缓冲区溢出 ***:终止 Aborted”
【发布时间】:2021-05-11 11:10:26
【问题描述】:

每当我在服务器端为 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, 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, 0,(struct sockaddr *) &g_UDP_ClientAddr, &len);

【问题讨论】:

    标签: sockets networking udp serversocket udpclient


    【解决方案1】:
    tmp = recvfrom(g_iUDP_datalogger_soc, [YOUR BUFFER ?] , SIZE_UDP_MSG, 0,(struct sockaddr *)...
    

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2012-08-30
        • 2022-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-01
        • 2012-09-17
        相关资源
        最近更新 更多