为了账号安全,请及时绑定邮箱和手机立即绑定

如何将字符串从 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 关注
  • 140 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号