2010-07-22 14 views
7

Recuerdo haber leído en alguna parte que un socket puede considerarse como dos canales half-duplex independientes. ¿Significa que recv() y send() del mismo socket son realmente irrelevantes?¿es seguro recv() y send() en un socket al mismo tiempo?

  • si es así, ¿es por definición o aplicación específica?
  • si no, ¿cómo los dos interfieren entre sí?

gracias.

+1

depende del protocolo. TCP es full-duplex, entonces sí. –

+0

Gracias, ¿tiene algún contraejemplo? o cualquier otro enlace de referencia/código para que pueda leer? –

Respuesta

1

Tengo curiosidad de cómo crees que sería interferir entre sí. ¿Estás pensando que podrías recibir lo que enviaste?

+1

No, me refiero a cómo se puede influir en la corrección o eficiencia del comportamiento del otro, si es que lo hacen. Por ejemplo, si comparten el mismo búfer, es muy probable que uno deba esperar hasta que el otro esté inactivo, ¿verdad? –

+1

Puede enviar y recibir mensajes bloqueantes o no bloqueantes. Con el bloqueo, el búfer de datos que pasa es el búfer de datos. No hay posibilidad de confusión. Con el no bloqueo, su buffer de datos se copia. No hay restricciones en la documentación de la API con respecto al uso intercalado, por lo que deben estar utilizando diferentes almacenamientos intermedios; porque si no lo fueran, no podrían ser no bloqueadores (tendrían que bloquearse el uno al otro). –

1

En caso de SOCK_STREAM, puede usar send/recv concurrentemente.

Ex: Suponga que tiene dos hilos, uno es responsable de enviar los datos y segundo se encarga de recibir los datos se puede hacer después de

principal de rutina: obtener una fd zócalo. crea una secuencia POSIX para enviar el buffer a este fd. crea un hilo POSIX para recibir los datos que llegan de este fd. conectarse a un servidor.

Subproceso 1 Rutina: construir un búfer de mensajes; envíe el buffer a este fd.

Subproceso 2 Rutina: recv datos de este fd. procesa la fecha.

Cuestiones relacionadas