2014-05-16 2 views
0

다음과 같은 문제가 있습니다. 특히 recvfrom() 메서드에 전달 된 버퍼 인수에서 uint32_t 및 char *를 추출하려고합니다. 이때, 정수 적절히 다음 코드를 사용하여 추출 될 수recvfrom() 버퍼에서 값에 액세스

recvfrom(s, buf, buffer_size, 0, (struct sockaddr*)&si_other, &slen); 

uint32_t recv_int = ntohl(*(int*)buf); 

char* recv_char = (char*)malloc(6); // NOTE: The original string was "Hello", which has 6 bytes. 
strcpy(recv_char, ((char*)buf + sizeof(uint32_t))); 

printf("The returned values are %d %s\n", recv_int, recv_char); 

을 그러나, 상기와 같이 I 만 recv_int가 값을 가지고의 printf를 수행하는 경우. recv_char은 빈 문자열입니다. 그러나 원래 버퍼에 "Hello"가 저장되어 있으므로 "Hello"를 stdout에 출력해야합니다.

편집 : 어떤 도움을 주시면 감사하겠습니다

uint32_t my_int = 3; 
char* sendString = "Hello"; 
char* buffer = (char*)malloc(strlen(sendString) + sizeof(int)); 
memcpy(buffer, &my_int, sizeof(int)); 
strcpy((char*)buffer + sizeof(int), sendString); 

if (sendto(s, buffer, sizeof(int) + strlen(sendString), 0, (struct sockaddr*)&si_other, slen) == -1) 
{ 
    printf("Issue with send\n"); 
} 

:

이() sendto를에 사용 된 코드입니다.

+1

버퍼에서 벗어난 문자열이 비어 있으면 보낸 문자열이 비어 있음을 의미합니다. 데이터를 어떻게 만들고 보내고 있습니까? 또한'recvfrom'의 반환 값을 검사하지 않기 때문에 모든 데이터를 받았는지 전혀 알지 못합니다. –

+0

송신 코드도 함께 게시해야합니다. "'uint32_t'와'char *'를 추출합니다 - 당신의 코드 (현명하게)는'char * '가 아닌 ASCIIZ 문자열을 추출합니다 - 실제'char *'를 보내지 않았는지 확인하십시오. –

+0

'printf'에 중단 점을 설정하고 버퍼 내용을 보는 것으로 디버깅 할 수 있습니다. 또는 간단한 루프로 버퍼 내용을 인쇄합니다'for (i = 0; i <10; i ++) printf ("% 02x" , buf [i]);'('buf'가'char *'라고 가정). – user3386109

답변

0

당신은 문자 문자열의 0 종단을 고려하여 전송 버퍼 한 바이트 더 확인해야합니다.

char* buffer = (char*)malloc(strlen(sendString) + 1 + sizeof(int));