クライアントがサーバーに何かを書き込み、それがクライアントにエコーバックされる単純なtcpサーバー/クライアントアプリを作成しました。ただし、サーバーがクライアントにエコーバックしたものを読み取ろうとすると、いくつかの問題が発生します。
string s;
while((n = read(socketFD[0],readBuf, BUFFER_SIZE)) > 0){
cout<<"\nBytes read: "<<n<<endl;
s.append(readBuf, n);
}
cout<<"\nTest after read\n";
サーバーに16KBのテキストを書き込みます。クライアントで読んでいるときは、一度に4KBを読んでいます。
このコードからの出力は次のとおりです。
Bytes read: 4096
Bytes read: 4096
Bytes read: 4096
Bytes read: 4046
読み取り呼び出しは、ソケットからの読み取りが完了した後にブロックされ、ループを離れることはないようです。どうすればこれを修正できますか?
編集:これは、接続されたクライアントを処理するサーバー内のコードです。
if((childpid = fork()) == 0){
close(listenFD);
while ((n = read(connectFD, buf, BUFFSIZE)) > 0){
cout<<"\nBytes read: "<<n<<endl;
write(connectFD, buf, n);
}
cout<<"\nTest after read\n";
exit(0);
}
この出力は次のとおりです。
Bytes read: 4096
Bytes read: 4096
Bytes read: 4096
Bytes read: 4046
Test after read
ここでは、クライアントのコードと何が違うのですか?クライアントの場合とは異なり、読み取り呼び出しがブロックされないのはなぜですか?