2016-03-21 10 views
0

私はエッジトリガepollプログラミングを学ぶためにしようとしてきました。それは同様EAGAINを返すまで、それは私がすべきrecvfrom以上のループを意味するの - 私はそれがUDPソケットに来るとき、それはEAGAINを返すまでepoll_wait後に1がrecv以上のループがすべきかについて少しについて混乱していますか?もしそうなら、アプリケーションが受信したバイト数よりも少ないバイト数を読み込もうとしている場合に備えて、UDPパケットをバッファリングする必要があります。しかし、私がループするとrecvfromが出る可能性もあります。異なるソースから複数のパケットが届く可能性があります。sockaddrもバッファリングしなければならない可能性があります。これは本当ですか?エッジ・トリガファイルディスクリプタとUDPののrecvfrom()

+0

あまりにも多くの質問。 – socketpair

+0

UDPソケットのrecvfrom()は正確に1(または、呼び出しに失敗した場合は0)パケットを与えます。パケット全体に空き容量を与えないと、余分なバイトは永久に失われます。 – nos

答えて

2
  1. はい、EAGAIN = EWOULDBLOCKが発生するまでループする必要があります。これを達成するには、このソケット記述子にO_NONBLOCKを設定する必要があります。
  2. UDPパケットの一部を受信できません。
  3. 次回はイベントループに戻り、そのソケットから受信することができますが、EAGAINで終わらないパケットがソケットで受信されたときにカーネルがepol_waitを起動させないことに注意してください。
  4. EAGAINまでループしながら、reader starvationを防ぐために、あなたは100個のパケットを受信したときに、たとえば、このFDに受信が完了していないという情報を保存しなければならないことを忘れないでください。その後、別のFDを試す必要があります。イベントループに戻るには、保存された情報を分析し、未受信パケットを受信しようとします。
  5. 私はあなたについてsockaddrを言ってみてください何を理解していません。 1で
+0

for(4)、私はrecvfromでループすれば、2つの異なる送信元アドレスから2パケットを受信することはできないでしょうか?したがって、上記のアプリケーションが1パケットを受け取るのを待っていて、ループするとrecvfromから2つのパケットが得られた場合、アプリケーションが別のパケットを受信するまで2番目のパケットをバッファリングする必要があります。 – atanamir

+0

@atanamirはい、可能です。 'recvfrom()'を使います。受信した直後にパケットを処理し、次に第2のパケットを受信することができます。または、いくつかの基準まですべてのパケットをバッファリングすることができます。あなたのプログラムをどのように消滅させるかはあなた次第です。 – socketpair

関連する問題