2011-12-26 13 views
9

まあ、私の質問は基本的なもののように見えるかもしれませんが、私はネットワークプログラミングの面で新しいです。 私は知りたいです:ソケットを常にバインドする必要がありますか?

1)メッセージを受信するためにソケットをバインドする必要がありますか?私は直接recvfromとそれがbindを呼び出し、もう1つのコードを呼び出すコードを呼び出すスニファコード(rawソケット)を見ました。

2)AF_ *とPF_ *ファミリーの違いは何ですか?後でPOSIXに関連していますか? どちらがお勧めですか?

+0

1)いいえ、UDP受信のバインドはオプションです。 –

+0

http://stackoverflow.com/questions/2549461/what-is-the-difference-between-af-inet-and-pfinet-constants。 IIRC、Pはプロトコル(ファミリ)、Aはアドレスを表します。 – Aif

+0

@Kerrek SB:しかし、私が参照しているスニッファのコードは、他のプロトコルのパケットも同様にキャプチャしますが、依然として 'bind'は呼び出されませんでした。 – kingsmasher1

答えて

8

いいえ、あなたはbind()する必要はありません。

connect()またはsendto()で宛先にパケットを送信する予定のTCPまたはUDPソケットを使用している場合、カーネルは試用時にソケットを適切なポート番号に自動的にバインドします接続または送信する。これは一般に好ましい方法です。 bind()クライアントソケットは有害とみなされます。

AF_UNIXソケットについても同じことが言えます。クライアント側はバインドする必要はなく、通常はそうしてはいけません。

+0

KerrekSBは、パケットを受信するためだけにKerrekSBに同意しません。右?上記のリンクからもわかるように、接続する必要はありません。 'socket'の後に' recvfrom'が続くだけです – kingsmasher1

+0

私はTCPソケットまたはUDPソケットについて話していました。生のソケットで何が起こるかは本当に関係ありません。 – MarkR

+0

クライアントソケットのバインドが有害であると思われる理由を説明できますか? – Pacerier

0

Linuxについてはわかりませんが、Windowsでは、recvfrom()がバインドされていないソケットで呼び出された場合、エラーWSAEINVALで失敗します。

+0

私はあなたがすでにいくつか送信していない限り、特定のポートにバインドされていないUDPソケットでパケットを受信しようとすると便利ではないと思います。ソケットを「気にしない」ポートにバインドし、getsocknameでポートを見つけることは可能です。たとえば、UDPを使用してサーバーからパケットを受信したいが、TCPを使用して(同時に)コマンドを送信する場合(たとえば、UDPで受信するだけのストリーミング状況など)は送信しないでください。私はポート0にバインドする必要はありません(気にしない)、私のプロトコル(TCP)を介してサーバーにポート番号を渡す。 – MarkR

関連する問題