首页 > 解决方案 > 如何将字符串从 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

标签: pythoncsocketsnetworkingctypes

解决方案


C 字符串以空值结尾,这意味着有一个 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失败的结果。


推荐阅读