使用以下伪Python脚本将数据发送到本地套接字:
s = socket.socket(AF_UNIX, SOCK_STREAM)
s.connect("./sock.sock")
s.send("test\n")
s.send("aaa\0")
s.close()
我的C程序将随机结束recv
以下缓冲区:
test\n
test\n<random chars>
test\naaa
(正如所料)套接字在recv()
点之后是套接字可读的select()
。问题是,如何避免前两种情况?
并提出问题:是否可以从该脚本发送以下两条消息:
asd\0
dsa\0
让select()
在每个send
上显示套接字是可读的,或者只有在我再次运行脚本时才会这样做(重新启动套接字客户端connect
离子)并为每个connect
发送消息?
答案 0 :(得分:1)
猜测,recv的len
参数指定要读取的最大数据量,而不是要返回的精确数量。 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所述,如果您需要发送不可预测的数据量,请考虑定义一个简单的协议,该协议要么以每个消息的长度开始记录,要么以特定的字节或字节序列结束。