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");
}
任何幫助,將不勝感激。
如果您從緩衝區中取出的字符串爲空,則表示您發送的字符串爲空。你如何構建和發送數據?你也沒有檢查'recvfrom'的返回值,所以你不知道你是否收到了所有的數據或者只是其中的一部分。 –
你也應該發佈你的發送代碼。 「提取一個'uint32_t'和一個'char *'」 - 你的代碼(明智地)提取一個ASCIIZ字符串,而不是'char *' - 確保你沒有發送實際的'char *'。 –
你可以通過在'printf'處設置一個斷點,然後查看緩衝區內容,或者用一個簡單的循環打印緩衝區內容'for(i = 0; i <10; i ++)printf(「%02x」 ,buf [i]);'(假設'buf'是'char *')。 – user3386109