해당 제품
이 문서의 해결책을 실행할 수 있는 제품을 보여줍니다. 이 해결책은 다른 유사한 제품 또는 어플리케이션에도 적용될 수 있습니다.
문의사항
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;
}