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失败的结果。
添加回答
举报