2010-07-22 11 views
7

Ricordo di aver letto da qualche parte che una presa può essere considerata come due canali half-duplex indipendenti. Significa che lo recv() e lo send() dello stesso socket sono effettivamente irrilevanti?è sicuro recv() e send() su un socket contemporaneamente?

  • se così è, per definizione o specifico dell'implementazione?
  • in caso contrario, in che modo i due interferiscono tra loro?

grazie.

+1

dipende dal protocollo. TCP è full duplex, quindi sì. –

+0

Grazie, hai qualche contro-esempio? o qualsiasi altro link/codice di riferimento in modo che io possa leggere? –

risposta

1

Sono curioso di sapere come si pensa che interferire con l'altro. Stai pensando che potresti ricevere ciò che hai inviato?

+1

No, intendo come si può influenzare la correttezza o l'efficienza del comportamento dell'altro, se lo fanno. Ad esempio, se condividono lo stesso buffer, è molto probabile che uno debba attendere che l'altro sia inattivo, giusto? –

+1

È possibile emettere mandate e ricevimenti bloccanti o non bloccanti. Con il blocco, il buffer di dati che si passa in IS è il buffer di dati. Nessuna possibilità di confusione. Con il non blocco, il tuo buffer di dati viene copiato. Non ci sono restrizioni nella documentazione dell'API per quanto riguarda l'uso interleaved, quindi devono utilizzare buffer differenti; perché se non lo fossero, non potrebbero essere non-bloccanti (dovrebbero bloccarsi l'un l'altro). –

1

In caso di SOCK_STREAM, è possibile utilizzare send/recv contemporaneamente.

Es: Supponiamo di avere due thread, uno è responsabile per l'invio dei dati e la seconda è responsabile per la ricezione dei dati si può fare seguendo

principale Routine: ottenere un fd presa. crea un thread POSIX per inviare il buffer a questo file. creare un thread POSIX per ricevere i dati arrivati ​​da questo file. connettersi a un server.

Sequenza di thread 1: costruire un buffer di messaggi; invia il buffer in questo file.

Thread 2 Routine: dati recv da questo file. elaborare la data.

Problemi correlati