我正在用 C 撰寫 TFTP 客戶端。到目前為止,我在將檔案讀入緩沖區(512 B)并將其傳輸到服務器方面沒有問題。但是,我正在努力閱讀包含二進制資料的 PDF 之類的檔案。
size_t nmemb = fread(data_buf, sizeof(char), 512, fp);
...
/* Create DATA packet and send it to TFTP server */
count = sprintf(message, "%c%c%c%c%s", 0, DATA, 0, block_number, data_buf);
sendto(sock, message, count, 0, (const struct sockaddr *)&server, sizeof(server));
我通過單獨列印每個緩沖區對此進行了測驗:printf("%d: %s\n", nmemb, data_buf);
看起來nmemb總是 512,這是正確的,但是printf()當它到達第一個 NULL 位元組時停止列印資料,我確定它代表給定字串(緩沖區)的結尾。
通過 TFTP 協議發送的 DATA 資料包中的緩沖區資料也在第一次出現 NULL 位元組時被切斷 - 我在 Wireshark 中對此進行了測驗。
有沒有辦法通過使用某種替代方法fread()或更改通過套接字發送資料包的方式來解決此問題?感謝您的任何回答。
uj5u.com熱心網友回復:
您不能printf為此使用函式系列,因為它們會在\0遇到時停止。
第一種方法:使用memcpy:
size_t nmemb = fread(data_buf, 1, sizeof data_buf, fp);
char message[sizeof data_buf 4]; // presumably
count = sprintf(message, "%c%c%c%c", 0, DATA, 0, block_number);
memcpy(message count, data_buf, nmemb);
第二種方法(首選方法):避免復制并fread直接復制到您稍后將發送的緩沖區中:
char message[512 4] = {0, DATA, 0, block_number};
size_t nmemb = fread(message 4, 1, 512, fp);
sendto(sock, message, nmemb 4, 0, (const struct sockaddr *)&server, sizeof(server))
注意:sizeof(char)始終為 1。它不能是其他任何東西。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/356310.html
