LabWindows™/CVI™에서 UDP 예제를 사용할 때 문자열 인수에 Null이 없으면 치명적인 오류 발생

업데이트 됨 Dec 18, 2023

해당 제품

소프트웨어

  • LabWindows/CVI

프로그래밍 언어

  • C

다른

UDP

문의사항

LabWindows / CVI에서 UDP 예제를 사용하고 있지만 UDPReader.c 파일에 오류가 있습니다. errChk (SetCtrlVal (panelHandle, PANEL_TEXTBOX, msg)) 에서 오류가 발생 하며 해당 코드는 다음과 같습니다.

int CVICALLBACK UDPCallback (unsigned channel, int eventType, int errCode, void *callbackData)
{
    int error = 0,
        size;
    unsigned char  *msg = NULL;
    if (eventType == UDP_DATAREADY)
    {
        char            srcAddr[16];
        unsigned int    srcPort;
        char            msgSourceString[16 + 10];
        errChk (size = UDPRead(channel, NULL, 0, UDP_DO_NOT_WAIT, NULL, NULL));
        nullChk (msg = malloc(size));
        errChk (size = UDPRead(channel, msg, size, UDP_DO_NOT_WAIT, &srcPort, srcAddr));
        sprintf(msgSourceString, "[%s:%d]: ", srcAddr, srcPort);
        errChk (SetCtrlVal(panelHandle, PANEL_TEXTBOX, msgSourceString));       
        errChk (SetCtrlVal(panelHandle, PANEL_TEXTBOX, msg));
        errChk (SetCtrlVal(panelHandle, PANEL_TEXTBOX, "\n"));
    }
Error:                                                               
    if (error < 0)
        MessagePopup("Error", GetGeneralErrorString(error));;
    if (msg)
        free(msg);
    return 0;
}


오류 코드는 다음과 같습니다.
FATAL RUN-TIME ERROR: Missing terminating null in string argument.

해결책

이 오류는 문자열 인수 msg에 종료 문자 null '\0'이 없음을 의미합니다.
당신의 UDP 메시지의 크기가 'size'라면, msg에 '\0'이 포함될 수 있도록 'size+1'의 크기로 메모리를 지정해야 합니다 :

int CVICALLBACK UDPCallback (unsigned channel, int eventType, int errCode, void *callbackData)
{
    int error = 0,
        size;
    unsigned char  *msg = NULL;
    if (eventType == UDP_DATAREADY)
    {
        char            srcAddr[16];
        unsigned int    srcPort;
        char            msgSourceString[16 + 10];
        errChk (size = UDPRead(channel, NULL, 0, UDP_DO_NOT_WAIT, NULL, NULL));
        nullChk (msg = malloc(size+1));
        msg[size]='\0'

        errChk (size = UDPRead(channel, msg, size, UDP_DO_NOT_WAIT, &srcPort, srcAddr));
        sprintf(msgSourceString, "[%s:%d]: ", srcAddr, srcPort);
        errChk (SetCtrlVal(panelHandle, PANEL_TEXTBOX, msgSourceString));       
        errChk (SetCtrlVal(panelHandle, PANEL_TEXTBOX, msg));
        errChk (SetCtrlVal(panelHandle, PANEL_TEXTBOX, "\n"));
    }
Error:                                                               
    if (error < 0)
        MessagePopup("Error", GetGeneralErrorString(error));;
    if (msg)
        free(msg);
    return 0;
}