gpt4 book ai didi

c - select()ed 套接字无法接收完整数据

转载 作者:行者123 更新时间:2023-11-30 15:52:14 27 4
gpt4 key购买 nike

使用以下伪 Python 脚本将数据发送到本地套接字:

s = socket.socket(AF_UNIX, SOCK_STREAM)
s.connect("./sock.sock")
s.send("test\n")
s.send("aaa\0")
s.close()

我的 C 程序将随机结束 recv ing 以下缓冲区:

  • test\n
  • test\n<random chars>
  • test\naaa (如预期)

套接字正在 recv()之后select()指出套接字是可读的。问题是,如何避免前两种情况?

还有一个附带问题:是否可以从该脚本发送以下两条消息:

  • asd\0
  • dsa\0

并且有select()将每个 send 上的套接字显示为可读s,或者仅当我再次运行脚本(重新启动套接字客户端 connect ion)并为每个 connect 发送消息时才会这样做?

最佳答案

据猜测,recvlen 参数指定要读取的最大数据量,而不是要返回的精确数据量。 recv 可以自由返回任意数量的数据最多 len 字节。

如果要读取特定数量的字节,请循环调用recv

 int bytes = 0;
while (bytes < len) {
int remaining = len - bytes;
int read = recv(sockfd, buf+bytes, remaining, 0);
if (read < 0) {
// error
break;
}
bytes += read;
}

正如 junix 所指出的,如果您需要发送不可预测的数据量,请考虑定义一个简单的协议(protocol),该协议(protocol)要么以每条消息的长度注释开始,要么以特定字节或字节序列结束。

关于c - select()ed 套接字无法接收完整数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14611505/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com