python - 如何将字符串从 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
解决方案
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
失败的结果。
推荐阅读
- c# - 我似乎无法理解此 C# 代码中用于从输入字段中计算字符的当前错误
- python - 熊猫合并返回一个空的数据框
- list - TypeError:'<'不支持Python中的'list'
- python - 计数到第一列并总结到其余列 pandas groupby
- eclipse - 使用 Subclipse 插件
- keras - Google AI Platform 上的所有超调试验都失败了
- xcode - 旧 iOS 版本中 Xcode 模拟器屏幕出错
- javascript - JS Keydown 在第一个事件之后触发事件之前有一些奇怪的 1 秒延迟
- javascript - 如何存储谷歌浏览器扩展的按钮保存状态
- algorithm - 给定“截止日期”,二分搜索是否最优?