2014-05-16 138 views
0

我遇到以下問題。特別是,我試圖從傳遞給recvfrom()方法的buffer參數中提取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); 

然而,當我執行的printf如上所示,只有recv_int具有值。 recv_char是一個空白字符串。但是,我最初在緩衝區中存儲了「Hello」,因此應該將「Hello」打印到stdout。

編輯:

這是已被在SENDTO()使用的代碼:

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"); 
} 

任何幫助,將不勝感激。

+1

如果您從緩衝區中取出的字符串爲空,則表示您發送的字符串爲空。你如何構建和發送數據?你也沒有檢查'recvfrom'的返回值,所以你不知道你是否收到了所有的數據或者只是其中的一部分。 –

+0

你也應該發佈你的發送代碼。 「提取一個'uint32_t'和一個'char *'」 - 你的代碼(明智地)提取一個ASCIIZ字符串,而不是'char *' - 確保你沒有發送實際的'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));