亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

鴻蒙傳說 2022-11-18 20:45:40
我試過將字符串從 Python 套接字發送到 C 套接字,但出于某種原因,當在 C 中接收字符串時,我不得不額外接收 2 個字符,我認為這是一個換行符。由于我不想要換行符,并且由于我認為有更好的方法來完成我正在做的事情,我如何才能將字符串從 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
查看完整描述

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失敗的結果。


查看完整回答
反對 回復 2022-11-18
  • 1 回答
  • 0 關注
  • 128 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號