2014-11-13 11 views
5

Secondo le pagine man:Utilizzo di write()/read() sul socket UDP?

L'unica differenza tra send() e write (2) è la presenza di bandiere. Con un argomento di zero flags, send() è equivalente a write (2). Inoltre, la seguente chiamata invia (sockfd, buf, len, flags); è equivalente a sendto (sockfd, buf, len, flags, NULL, 0);

e

Il recv() chiamata viene normalmente utilizzato solo su una presa collegata (vedere Collegamento (2)) ed è identico al recvfrom() con un argomento NULL src_addr.

Inoltre, se non sbaglio (non riusciva a trovare nelle pagine man), recv con flags == 0 è equivalente a read (analogica a write e send).


Quindi:

  • Questo significa, che l'utilizzo di read su un socket UDP è perfettamente bene (se non ho bisogno del src_addr)?
  • c'è un modo per utilizzare write sulla presa UDP (come ora ho impostato l'indirizzo di destinazione nel parametro)?
+0

Perché il tag 'c'? – admdrew

+3

@admdrew - perché no? Non c'è nulla di specifico in C++ qui (eccetto il mio commento non necessario alla classe 'socket_connection', che è assolutamente irrilevante) –

+0

Sì,' socket_connection' era ciò di cui ero confuso. – admdrew

risposta

3

Inoltre, se non sbaglio (non riusciva a trovare nelle pagine man), :: recv con bandiere == 0 è equivalente a :: lettura (da analogico a :: Write e :: send)

Sì, è corretto se il descrittore di file è un socket: send/recv non riuscirà altrimenti con EBADF.
Ed è anche vero che in un modello orientato alla connessione send equivale a sendto e recv a recvfrom con NULL sockaddr * perché il protocollo già fornisce loro.

Con UDP, tuttavia, non c'è alcuna connessione in modo da una chiamata in questo modo:

// assume fd to be an UDP socket 
write(fd, buff, bytes) 

non avrebbe senso in quanto non destinazione non sia prevista (EDESTADDRREQ). Invece, quando leggi un pacchetto, sai da dove viene e potresti voler usare quell'IP nel caso in cui qualcosa non andasse, per esempio.

Il mio consiglio è:

  • Usa send/recv se siete in una modalità di connessione orientato ad esempio TCP
  • Utilizzare sendto/recvfromprincipalmente per comunicazioni senza connessione e.g UDP
  • Usa write/read se non è necessario specificare alcuna bandiera e per I raw/O (le funzioni di cui sopra possono essere considerare come quelli di livello superiore)

non consiglierei una singola classe, che gestisce entrambi i protocolli ma piuttosto due specializzati; non mescolare i protocolli.

+0

Sono assolutamente d'accordo con i consigli, penso allo stesso modo, ma sono stato tentato di usare qualcosa di molto, molto simile (quasi la stessa), che esiste già ed è stato testato per anni. +1, aspetterò un po 'di più per altri commenti/risposte. –

4
  • L'utilizzo di read() su un socket UDP è perfettamente soddisfacente se non è necessario l'indirizzo di origine.
  • È possibile utilizzare write() se si usa lo connect() socket UDP nella destinazione.