如何将字符串从 Python 套接字发送到 C 套接字?

我试过将字符串从 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


鸿蒙传说
浏览 141回答 1
1回答

繁花如伊

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失败的结果。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python