アプリケーションを見るようになったこの奇妙なことに出会ったのは、デフォルトでSOCK_STREAM
関数。なぜそうですか?これは SOCK_STREAM
単に複数のストリームを作成しますか?または、標準のSOCK_STREAM
TCP stream(s)?
私は津波がUDPに基づいていると思っていましたが、まだTCPのようないくつかの機能を持っていますTCP公平性、友好性など。
誰かがこの問題に光を当ててください。私はこれについて完全に混乱しています。
TCPはほとんど常にSOCK_STREAM
を使用し、UDPはSOCK_DGRAM
を使用します。
TCP(SOCK_STREAM
)は接続ベースのプロトコルです。接続が確立され、接続が一方の当事者またはネットワークエラーによって終了されるまで、2つの当事者は会話を行います。
UDP(SOCK_DGRAM
)は、データグラムベースのプロトコルです。 1つのデータグラムを送信し、1つの応答を取得すると、接続が終了します。
複数のパケットを送信する場合、TCPはそれらを順番に配信することを約束します。UDPはそうではないため、順序が重要な場合、受信者はそれらをチェックする必要があります。
TCPパケットが失われた場合、送信者は通知できます。UDPの場合はそうではありません。
UDPデータグラムのサイズには制限があり、メモリからは512バイトだと思います。 TCPはそれよりはるかに大きな塊を送信できます。
TCPはもう少し堅牢で、より多くのチェックを行います。 UDPは日陰の軽いウェイトです(コンピューターとネットワークのストレスが少ない)。
他のコンピューターとの対話方法に適したプロトコルを選択します。
更新:私の答えはこれ以上関連性がないようですが、元の質問はUDTに言及しました。UDTはUDPの上に構築された接続指向のプロトコルです。詳細はこちら: http://en.wikipedia.org/wiki/UDP-based_Data_Transfer_Protocol
UDTは、従来のBSDソケットAPIを模倣するAPIを提供しているように見えるため、ストリーム指向およびデータグラム指向のアプリケーションの両方で、ドロップイン置換として使用できます。確認してくださいsendmsg
およびrecvmsg
-SOCK_STREAM
で作成されたソケットで使用すると例外がスローされ、すべてのストリーム指向APIはSOCK_DGRAM
で作成されたソケットで例外をスローします上手。
SOCK_DGRAM
の場合、それはいくつかの追加処理を実行しますが、そのような場合にUDPソケットを単純に透過的にラップするわけではありません-クイックレビューの後でコードを理解する限り(UDT内部またはプロトコル仕様)。 技術論文 を読むことは大いに役立つでしょう。
ライブラリは常に、その基礎となる「実際の」ソケットをデータグラム1として作成します(channel.cpp、CChannel::open
を確認してください)。