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 elsrc_addr
)? - ¿Hay alguna manera de usar
write
en 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.