1 回答

TA貢獻2012條經驗 獲得超12個贊
C 字符串以 null 結尾,這意味著有一個 0 ( '\0') 字符標記字符串的結尾。如果沒有該字符,您將使用內存中接下來發生的任何事情作為字符串的一部分。
這意味著每個字符串緩沖區都需要比實際字符串長度大一個。您只是在傳輸字符串的內容,而不是 C 字符串的表示形式。
添加 NUL 字符有兩種選擇。您可以在 Python 端添加它,并在 C 端再接收一個字符,或者保持 Python 代碼相同并'\0'在 C 中添加:
此代碼僅顯示對 C 的更改
#define MSGHDR_SIZE 4
// ...
char* msghdr = malloc((MSGHDR_SIZE + 1) * sizeof(char));
ssize_t recv_result = recv(i, msghdr, MSGHDR_SIZE, 0);
if (recv_result == -1) {
// Handle error
} else {
msghdr[recv_result] = '\0';
}
這里以實際接收到的字節數作為索引,在該處添加NUL字符,確保緩沖區始終為有效字符串。
我還使用了預處理器宏MSGHDR_SIZE。這通常被認為是避免“幻數”的良好做法。
另外,我刪除了對malloc. 請參閱我是否投射 malloc 的結果?.
此代碼顯示在 Python 中添加字符
sock.send(bytes("FPUT", "utf-8") + b'\0')
// Includes NUL character
#define MSGHDR_SIZE 5
// ...
char* msghdr = malloc(MSGHDR_SIZE * sizeof(char));
ssize_t recv_result = recv(i, msghdr, MSGHDR_SIZE, 0);
if (recv_result == -1) {
// Handle error
} else {
msghdr[recv_result] = '\0';
}
此外,您應該檢查malloc失敗的結果。
添加回答
舉報