非ブロックudpソケットプログラミングC:軽微な不具合に対応しました。■
-
19-09-2019 - |
質問
い問題が何なのかを理解す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.ができないバックアップしていくべきます。しょうが良い。
編集:ん取り寄せできませんの半分データグラム.のいずれかのデータグラムそれをバッファーしていない.