非ブロックudpソケットプログラミングC:軽微な不具合に対応しました。■

StackOverflow https://stackoverflow.com/questions/2239986

質問

い問題が何なのかを理解すrecv()/recvfrom()から返される非blockig UDPソケットが開かれます。

具体的に比べて、TCP(修正してください私について知っておきましょ間違った):

  • ブロックソケットはTCPまたはUDP)さんからrecv()がつくまでデータのバッファです。このバイト数(TCP)または完全にデータグラム(UDP).

  • 非ブロックTCPソケットのいずれかを返しますEWOULDBLOCK(linux)/WSAEWOULDBLOCK(windows)またはバイトで現在のバッファです。TCPのデータをストリームなど多くのバイト数が返されます。

そこで問題:

  • 非ブロックUDPソケットのものを返しますWOULDBLOCK(linux)/WSAEWOULDBLOCK(windows)があれば危険有害反応可能性知見なし。しかし、あまりにもデータを延、非ブロックUDPソケットを返し一部のバイトをすることを意味なのだ半分のデータグラム又はUDPソケットを常に復帰完了datagrams??

編集:

んの"半分のデータグラム"は:した場合はどうなコrecv()で、そのソケットは現在受けているデータグラム.その瞬間がありバイトのバッファにデータグラムしています。

ご説明や、コメントありがたくお受けいたします。.よろしく!

役に立ちましたか?

解決

最後に言い訳を掘り出したスティーブンスの書籍からオフィスです。

提供バッファに十分な大きさの標準バークレーのソケット recv()recvfrom() 機能は戻らない部分的にデータグラム.のデータグラムを応用までをカーネルは完全に受信して再構築、データグラム.

興味深いことに、このわけではない(?) 問題は、本日その他のネットワークプログラミングインターフェイスな合意があったときの動作を提供バッファが小さすぎて:

従来のバークレー版のソケットAPI truncatesのデータグラムネの超過データです。るかどうかを通知に依存します。(4.3BSDリノ以降のできる通知は、アプリのデータグラムした切り捨てられます。)

このソケットAPIの下SVR4を含むSolaris2.x)なに切り詰めデータグラム.余分なデータが返されその後の読み込み.の通知は行いません複数の読み込みが満たさらUDPのデータグラム.

のTLI APIはない捨てのデータです。代わりにフラグが返されることを示すデータは、その後の読み込みの申請により返り、残りのデータグラム.

(スティーブンス、TCP/IP、量1,p.160)

他のヒント

あり、UDPだけを返しまうデータも送信されるデータグラム.UDPではないストリーム指向のようなTCP.Datagramsは離散トランスミッション、とんこれらのdatagramsします。さらに、ソケットオプションのためのTCPはSOCK_STREAM.

明るい側ができるように別々のトランスミッション、あるいなだけじゃない傷を付けても簡単なTCP.

ダウンロードいただけまく正確に一又はゼロdatagrams.ができないバックアップしていくべきます。しょうが良い。

編集:ん取り寄せできませんの半分データグラム.のいずれかのデータグラムそれをバッファーしていない.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top