0

使用以下伪 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()'d 。select()问题是,如何避免前两种情况?

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

  • asd\0
  • dsa\0

并且必须select()在每个 s 上将套接字显示为可读send的,还是只有在我再次运行脚本(重新启动套接字客户端connection)并为每个 s 发送消息时才会这样做connect

4

1 回答 1

1

猜测一下,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 所指出的,如果您需要发送不可预测的数据量,请考虑定义一个简单的协议,该协议要么以每条消息的长度注释开始,要么以特定字节或字节序列结束。

于 2013-01-30T18:53:26.760 回答