15

少し前に書いたコードをクリーンアップしているところですが、udp ソケットの場合、接続が閉じられたものとして 0 が扱われていることに気付きました。

これは、同等の tcp バージョンから同じ recv ループを移植した結果であると確信しています。しかし、それは私を不思議に思います。recv は udp に対して 0 を返すことができますか? tcp では、相手側が接続を閉じたことを通知します。udp には接続の概念がないため、0 を返すことはできますか? 可能であれば、それはどういう意味ですか?

注: Linux のマニュアル ページでは、戻りコードがゼロの場合に udp と tcp を区別していません。

4

2 に答える 2

15

udpには接続の概念がないので、0を返すことができますか?可能であれば、それはどういう意味ですか

これは、長さが0のデータグラムが受信されたことを意味します。偉大なUNPから:

長さ0のデータグラムを書き込むことは許容されます。UDPの場合、これにより、IPヘッダー(通常はIPv4の場合は20バイト、IPv6の場合は40バイト)と8バイトのUDPヘッダーを含み、データを含まないIPデータグラムが生成されます。 これは、recvfromからの戻り値0がデータグラムプロトコルに受け入れられることも意味します。TCPソケットでの読み取りからの戻り値0のように、ピアが接続を閉じたことを意味するわけではありません。UDPはコネクションレス型であるため、UDP接続を閉じるようなことはありません。

于 2012-09-20T04:08:46.303 に答える
-2

Linux では、UDP ソケットの recvfrom がゼロを返す理由が 2 つあります。

1) 長さゼロのデータグラムを受信した、または 2) ソケットでシャットダウンが呼び出された

2 番目の動作は、ソケットで待機しているスレッドのブロックを解除できるため便利です。ただし、recvfrom の呼び出し元が、ソケットがシャットダウンされたかどうか、または長さ 0 のデータグラムが受信されたかどうかを知る方法はありません。このためには、共有変数を使用するなど、ソケットがシャットダウンされたことをスレッドに通知する別の方法が必要です。

2 番目の動作も、recv(2) のマニュアル ページと矛盾しているように見えます。

When  a  stream socket peer has performed an orderly shutdown, the return 
value will be 0 (the traditional "end-of-file" return).

明らかに、ストリーム ソケットではない UDP ソケットでも発生します。

于 2020-01-04T01:08:02.993 に答える