socket que por enviar ejemplos comando archivos af_unix c++ c linux sockets udp

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 / recv si está en un modo orientado a la conexión, p. Ej. TCP
  • Use sendto / recvfrom principalmente para comunicaciones sin conexión, por ejemplo, UDP
  • Utilice write / read si 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 read en un socket UDP está perfectamente bien (si no necesito el src_addr )?
  • ¿Hay alguna manera de usar write en el socket UDP (como ahora establezco la dirección de destino en el parámetro dest_addr )?

  • Usar read() en un socket UDP está perfectamente bien si no necesita la dirección de origen.
  • Puede usar write() si connect() el socket UDP al destino.