que - socket udp c++
Usando write()/read() en el socket UDP? (2)
Además, si no me equivoco (no pude encontrarlo en las páginas man), :: recv con flags == 0 es equivalente a :: read (analogue to :: write y :: send)
Sí, es correcto si el descriptor de archivo es un socket: de lo contrario, se send / recv con EBADF.
Y también es cierto que en un modelo orientado a la conexión, el send es equivalente a send y recv a recvfrom null sockaddr * porque el protocolo ya los proporciona.
Con UDP, sin embargo, no hay conexión, por lo que una llamada como esta:
// assume fd to be an UDP socket
write(fd, buff, bytes)
no tendría sentido ya que no se proporciona ningún destino (EDESTADDRREQ). En cambio, cuando lee un paquete, sabe de dónde viene y es posible que desee usar esa IP en caso de que algo se vea mal, por ejemplo.
Mi consejo es:
- Use
send/recvsi está en un modo orientado a la conexión, p. Ej. TCP - Use
sendto/recvfromprincipalmente para comunicaciones sin conexión, por ejemplo, UDP - Utilice
write/readsi no especificará ninguna bandera y para E / S en bruto (las funciones mencionadas anteriormente pueden considerarse de mayor nivel)
No recomendaría una sola clase que maneje ambos protocolos, sino dos especializados; no mezcle los protocolos.
De acuerdo con las páginas del manual:
La única diferencia entre send () y write (2) es la presencia de banderas. Con un argumento de flags cero, send () es equivalente a write (2). Además, la siguiente llamada envía (sockfd, buf, len, flags); es equivalente a sendto (sockfd, buf, len, flags, NULL, 0);
y
La llamada a recv () se usa normalmente solo en un socket conectado (ver connect (2)) y es idéntica a recvfrom () con un argumento src_addr NULL.
Además, si no me equivoco (no pude encontrarlo en las páginas man), recv con flags == 0 es equivalente a read (analógico para write y send ).
Asi que:
- ¿Esto significa que usar
readen un socket UDP está perfectamente bien (si no necesito elsrc_addr)? - ¿Hay alguna manera de usar
writeen el socket UDP (como ahora establezco la dirección de destino en el parámetrodest_addr)?
- Usar
read()en un socket UDP está perfectamente bien si no necesita la dirección de origen. - Puede usar
write()siconnect()el socket UDP al destino.