2016-05-03 7 views
0

linux selectを使用してノンブロッキングソケットIOリアクタを実装しています。たとえば、サーバーとクライアントが通信しているとします。クライアントまたはサーバーがダウンしている場合、もう一方の側はreadコール(C関数呼び出し)の戻り値によって伝えることができるEOFを受け取ることになっています。EOFを使用した非ブロッキングソケットIOの多重化

if(read(fd, ...) == 0) { printf("Endpoint connection failed\n"); } 

私の質問は、このEOFイベントで読み取り重なったり、他のデータとマージされますか?たとえば、クライアントは1 byteをサーバーに送信し、誤ってすぐにシャットダウンします。時間が非常に近い場合、サーバ上のreadはまだ1 byteEOFに分離可能ですか?

+0

あなたがLinuxを使っていることが分かっているなら、 'select'を避けて代わりに' epoll'を使うことをお勧めします。あるいは、 'libev'のようなイベントライブラリを考えてみてください。私はこれらのことをやり直すのが大好きなので[私自身のフレームワーク](https://github.com/boazsegev/c-server-tools)を書いています。あなたは一見を持つことができます。 – Myst

答えて

2

もう一方の端は1つのバイトを送信し、接続を閉じた場合は、最初の1つのバイトを読み込みます、その後、readから呼び出しが0

を返し、その後、単一read通話のための方法はありませんクロージャを示すために0を返さなければならないので、両方を行う必要があります。

0

EOSは保留中のデータの後に配信されます。

関連する問題