2016-10-10 20 views
0

ソケットプログラミングでは、Cまたはjavaのコードを記述しているかどうかにかかわらず、ソケット:read()メッセージが受信されたときにプログラムがブロックされないとどうなるか

while(1) { 
    read(...); 
    /* process received msg */ 
    process(received_msg) 
} 

さて、クライアントがmsg1を受信し、それを処理して忙しいです:

クライアントは次のようにコードを持っています。これは、プロセッサがprocess()の内部で命令を実行していることを意味します。この時点で、msg2が到着します。しかし、それを受け取ることを今ブロックしているのはread()ではありません。着信メッセージmsg2はどうなりますか?

プロトコルに依存しますか?それは言語APIに依存しますか?

私はこの問題を克服することができるメッセージを受け取るたびに新しいスレッドを作ると思います。私の質問は、単一スレッドのコンテキストで何が起こるのかを理解することと、複数のスレッドを使用せずにこの作業を行う方法があれば理解することを目的としています。

+2

カーネルは受信したデータをバッファして、次の読み込み時に利用できるようにします。カーネルは、もはやバッファリングできなくても何が起きるか(プロトコルに依存する)を管理します。 – kaylum

+0

あなたのメッセージがソケットのバッファに収まる場合、そこにメッセージがあります。バッファがいっぱいになると、あなたのTCPスタック - (ソケットがストリーミングするので、TCP) - 送信者にそれらのパケットを保持するように通知します。 SO [他の側よりも速くブロッキングソケットにデータを書き込むとどうなりますか?](http://stackoverflow.com/questions/14241235/what-happens-when-i-write-data-to -a-blocking-socket-other-sideよりも速い)。 –

+0

"複数のスレッドを使用せずにこの作業を行う方法があれば" - シングルスレッドの同期処理*アプローチでは、プロセッサが送信者よりも遅く、TCPを使用している場合は、送信者も遅くなることで終了します。マルチスレッドが利用できない場合、UNIX-esは各要求に対して別のプロセスをfork/spawnするのに使用されました。 –

答えて

3

ここで受信メッセージmsg2はどうなりますか?

バッファリングされています。

プロトコルに依存しますか?

私はTCPについて説明していますが、UDPについても同様です。しかし、バッファがいっぱいになったときの動作はTCPとUDPで異なります。TCPは送信者を停止させます。 UDPは次のデータグラムを廃棄します。

言語APIに依存しますか?

私は新しいスレッドに私はこの問題を克服することができ、メッセージを受信するたびに作る場合、私は思います。

克服する問題はありません。

+0

>>克服することは問題ありません - 実際には1つあります。受信者が送信者の送信よりも遅い場合は、送信者がタイムアウトに直面し、受信者が最新の受信パケットからすべてを失うことがあります。 OSのTCPバッファではなくヒープでバッファするスレッドと、それを処理する他のスレッドを持つ方がよいでしょう。ここで、開発者はタスク要件を満たすためにヒープバッファサイズを決定できます。 – iXCray

関連する問題