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를에 사용 된 코드입니다.
버퍼에서 벗어난 문자열이 비어 있으면 보낸 문자열이 비어 있음을 의미합니다. 데이터를 어떻게 만들고 보내고 있습니까? 또한'recvfrom'의 반환 값을 검사하지 않기 때문에 모든 데이터를 받았는지 전혀 알지 못합니다. –
송신 코드도 함께 게시해야합니다. "'uint32_t'와'char *'를 추출합니다 - 당신의 코드 (현명하게)는'char * '가 아닌 ASCIIZ 문자열을 추출합니다 - 실제'char *'를 보내지 않았는지 확인하십시오. –
'printf'에 중단 점을 설정하고 버퍼 내용을 보는 것으로 디버깅 할 수 있습니다. 또는 간단한 루프로 버퍼 내용을 인쇄합니다'for (i = 0; i <10; i ++) printf ("% 02x" , buf [i]);'('buf'가'char *'라고 가정). – user3386109