0

ローカル ソケットにデータを送信するための次の疑似 Python スクリプトを使用します。

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

recv私の C プログラムは、次のバッファをランダムにing してしまいます:

  • test\n
  • test\n<random chars>
  • test\naaa(予想通り)

ソケットは、ソケットが読み取り可能であるというポイントrecv()の後に 'dされています。select()問題は、最初の 2 つのケースをどのように回避するかです。

副次的な質問: そのスクリプトから次の 2 つのメッセージを送信することは可能ですか。

  • asd\0
  • dsa\0

そしてselect()、それらのそれぞれでソケットを読み取り可能として表示する必要がありますか、それともスクリプトを再度実行して (ソケット クライアントイオンを再起動)、それぞれにメッセージを送信するsend場合にのみそうしますか?connectconnect

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 に答える