2011-12-26 13 views
9

Bueno, mi pregunta puede parecer básica, pero soy nuevo en el lado de la programación de redes. Deseo saber:¿Siempre se requiere enlazar un socket?

1) ¿Se requiere siempre unir un zócalo para recibir un mensaje de eso? Vi un código sniffer (socket sin formato) en el que está invocando directamente recvfrom y otro fragmento de código en el que está invocando bind y luego una recepción.

2) ¿Cuál es la diferencia entre la familia AF_ * y PF_ *? ¿El último está relacionado con POSIX? ¿Cuál es el recomendado?

+0

1) No, el enlace para la recepción UDP es opcional. –

+0

http://stackoverflow.com/questions/2549461/what-is-the-difference-between-af-inet-and-pf-inet-constants. IIRC, P significa protocolo (familia) mientras que A representa Dirección. – Aif

+0

@Kerrek SB: Pero el código de sniffer al que me refiero también captura paquetes de otros protocolos, pero aún así no se invocó 'bind' – kingsmasher1

Respuesta

8

No, no es necesario enlazar().

Si está utilizando un socket TCP o UDP en el que planea conectar() o enviar un paquete a un destino con sendto(), el kernel vinculará automáticamente el socket a un número de puerto adecuado cuando intente para conectar o enviar Esta es generalmente la forma preferida. bind() ing socket de cliente se considera dañino.

Lo mismo sucede con los sockets AF_UNIX: el lado del cliente no necesita vincularse, y no debe hacerlo normalmente.

+0

Entonces no está de acuerdo con KerrekSB, donde dice que solo es para recibir paquetes. ¿Derecha? Incluso no es necesario conectarse, como puede ver en los enlaces anteriores. Sólo una llamada a 'socket' seguido de' recvfrom' – kingsmasher1

+0

Estaba hablando de sockets TCP o UDP. Lo que ocurre en los sockets sin formato no es realmente relevante. – MarkR

+0

¿Puede explicar por qué el enlace de sockets de clientes se considera dañino? – Pacerier

0

No sé acerca de Linux, pero en Windows, si se llama a recvfrom() en un socket no vinculado, se producirá un error WSAEINVAL.

+0

No creo que sea útil intentar recibir paquetes en un socket UDP que no esté vinculado a un puerto específico, a menos que ya haya enviado algunos. Es posible vincular un socket a un puerto "do not care", luego encontrar el puerto con getsockname. Por ejemplo, si quisiera usar UDP para recibir paquetes de un servidor, pero use TCP para enviar comandos (al mismo tiempo); por ejemplo, en alguna situación de transmisión en la que solo recibo en UDP, nunca la envíe.Tendría que enlazar al puerto 0 (no me importa) y luego pasar el número de puerto sobre mi protocolo (TCP) al servidor. – MarkR

Cuestiones relacionadas