1

ubuntu 12.04では、仮想マシンからhttpパケットを受信し、そのパケットをVMの元の宛先に転送できる同時サーバーを作成したいと考えています。しかし、C言語のread関数を使用してパケットを読み取っている場合、戻り値とバッファーの長さが同じでないことがあります(たとえば、rbyte = 1024、strlen(buf)= 62)。errnoを確認したところ、errno = 0であることがわかりました。これは、読み取り関数にエラーがないことを意味します。これらの2つの変数はまったく同じである必要があると思いますが、私のプログラムではそうではありません。以下は私のコードの一部です:

char buf[1024];
size_t rbyte = read(sFrom, buf, sizeof(buf) );
cerr << "length of buf: " << strlen(buf) << "\n";
cerr << "rbyte: " << rbyte << "\n";

http://pubs.opengroup.org/onlinepubs/009695399/functions/read.htmlを読んで手がかりを得ましたが、このエラーの理由はまだわかりません。

誰かが理由を知っていますか?

4

2 に答える 2

4

リンクされたドキュメントに記載されているように、read文字列ではなくバイトを読み取るため、入力にゼロバイトが含まれる場合、読み取られたバイト数よりも少ない文字列が取得されます(Cはnullで終了する文字列を使用することを忘れないでください)。ヌル文字は文字列の終わり(したがって長さ)を決定します)

于 2012-05-21T17:29:47.127 に答える
3

これはエラーではありません。の3番目の引数はread()、読み取ることができる最大バイト数を意味します。3番目の引数のサイズに達するまでブロックされません。

の戻り値は、要求read()時にバッファーにあったバイト数を示します。read()

'n'バイト(n =メッセージサイズ)を読み取っていないときにループを実行する必要があります。または、read()0を返すまで(同期メッセージの場合)。

ヒント:(クライアント)nullで終了する文字列を作成する場合、サーバー側fdopen()でソケット記述子を実行してfgets()(ストリーミングバッファー)を使用すると、「\0」までコードがブロックされます。

于 2012-05-21T18:55:01.370 に答える