2010-07-22 31 views
7

Je me souviens avoir lu quelque part qu'une socket peut être considérée comme deux canaux semi-duplex indépendants. Cela signifie-t-il que recv() et send() du même socket ne sont pas pertinents?est-il sûr de recv() et send() sur un socket simultanément?

  • si oui, est-ce par définition ou spécifique à la mise en œuvre?
  • sinon, comment les deux interférer les uns avec les autres?

merci.

+1

dépend du protocole. TCP est en full-duplex, donc oui. –

+0

Merci, avez-vous un contre-exemple? ou tout autre lien/code de référence pour que je puisse lire? –

Répondre

1

Je suis curieux de savoir comment vous pensez qu'ils interférer les uns avec les autres. Pensez-vous que vous pourriez recevoir ce que vous avez envoyé?

+1

Non, je veux dire comment on peut influencer l'exactitude ou l'efficacité du comportement de l'autre, s'ils le font. Par exemple, s'ils partagent le même tampon, il est très probable qu'il faille attendre que l'autre soit inactif, n'est-ce pas? –

+1

Vous pouvez émettre des envois et des destinataires bloquants ou non bloquants. Avec le blocage, le tampon de données que vous transmettez est le tampon de données. Aucune chance de confusion. Avec non-blocage, votre tampon de données est copié. Il n'y a aucune restriction dans la documentation de l'API concernant l'utilisation entrelacée, ils doivent donc utiliser des tampons différents; car s'ils ne l'étaient pas, ils ne pourraient pas être non bloquants (ils devraient se bloquer l'un sur l'autre). –

1

Dans le cas de SOCK_STREAM, vous pouvez utiliser simultanément l'envoi/la réception.

Ex: Supposons que vous avez deux fils, est responsable de l'envoi des données et deuxième est chargé de recevoir les données que vous pouvez faire à la suite

principale routine: obtenir un fd socket. créer un thread POSIX pour envoyer le tampon à ce fd. créer un thread POSIX pour recevoir les données provenant de ce fd. se connecter à un serveur.

Thread 1 Routine: construire un tampon de message; envoyer le tampon dans ce fd.

Thread 2 Routine: Données de recv. De cette fd. traite la date.