web-dev-qa-db-ja.com

UDPソケットでconnect()/ send()/ recv()の代わりにsendto()/ recvfrom()を使用する目的は何ですか?

TCP vs UDPの概念は理解できますが、UDPパケットを送信する方法が2つある理由がわかりません。それでも、これが絶対に必要かどうかはわかりません。 bind()およびaccept() ..へ.

22
jokoon
  1. accept()はTCP用です。 UDPとは何の関係もありません。

  2. UDPのconnect()は、もう一方の端には何もしません。ローカルAPIを条件付けて、誰に送受信するかを認識します。

  3. それをまだ知らない場合、気にしない場合、または同じソケットで複数の宛先に送信したい場合は、connect()を使用せず、代わりにsendto()を使用します。同様に受信します。

    たとえば、UDPサーバーについて考えてみます。 recvfrom(),を呼び出すため、送信元アドレス情報を取得し、要求を処理し、応答を作成し、sendto().を介してそのアドレスに送信します。connect()は関与しません。どこでも、send()またはrecv().のいずれかを使用することはできません

  4. クライアントは送信するために固定のポート番号を必要とするため、サーバーをbind()するだけで済みます。クライアントはbind()をまったく必要としません。自動bind()は、システムによって割り当てられたローカルポート番号を使用して最初のsend()/sendto()/recv()/recvfrom()で実行されます。

40
user207421

TCPはコネクション型であり、UDPはコネクションレス型プロトコルであることを理解することが重要です。

  • TCP:リモートホストとの間でデータを送受信する前に、まず接続する必要があります。
  • UDP:接続は必要ありません。任意のホストとの間でデータを送受信できます。

通常、宛先を指定するために、UDPソケットでsendto()を使用します。同様に、通常はrecvfrom()を使用して、UDPデータの受信元を確認します。

ただし、実際には、UDPソケットでオプションとしてconnect()を使用できます。その場合、UDPソケットでsend()/recv()を使用して、connect()で指定されたアドレスにデータを送信し、そのアドレスからのみデータを受信できます。 (UDPソケットのconnect()はデフォルトのピアアドレスを設定するだけで、UDPソケットのconnect()は何度でも呼び出すことができ、UDPのconnect()はもちろん、ソケットは接続のためのハンドシェイクを実行しません。)

お役に立てれば。

19
enobufs