簡體   English   中英

如何將字符串從 Python 套接字發送到 C 套接字?

[英]How to send a string from a Python socket to a C socket?

我嘗試將字符串從 Python 套接字發送到 C 套接字,但由於某種原因,當接收到 Z0D61F8370CAD1D412F80B84D1423E1257Z 字符中的字符串時,我認為是換行符。 由於我不想要換行符,而且我認為有更好的方法來做我正在做的事情,我如何將字符串從 Python 套接字發送到 C 套接字? 我需要使用 Python 模塊 ctypes 嗎? 謝謝

這是我正在執行的行(在 Python 中):

sock.send(bytes("FPUT", "utf-8"))

為了接收整個消息,我必須在 C 中接收 6 個字符。 這是我在注意到錯誤之前嘗試的接收代碼:

char* msghdr = (char*) malloc(4*sizeof(char));
recv(i, msghdr, 4, 0); //i is the socket

C 字符串以 null 結尾,這意味着有一個 0 ( '\0' ) 字符標記字符串的結尾。 如果沒有該字符,您將使用 memory 中接下來發生的任何內容作為字符串的一部分。

這意味着每個字符串緩沖區都需要比實際字符串長度大一。 您只傳輸字符串的內容,而不是 C 字符串的表示。

添加 NUL 字符有兩種選擇。 You could add it on the Python side, and receive one more character on the C side, or keep the Python code the same and add the '\0' in 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的結果是否失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM