Communication bidirectionnelle dans la programmation de socket en C

J’ai un petit doute en programmation de socket. Je peux envoyer mes données de client à serveur et mon serveur traite les données. Le o / p des données traitées, je veux renvoyer à mon client. Nous pouvons donc “écrire” les données sur le client en utilisant le même socket. Je veux dire un serveur écoute sur un port avant d’accepter une connexion et de recevoir des données. De même, dois-je obliger mon client à écouter un autre port (le lier avec un autre socket) et à connecter mon serveur à ce socket et de transférer les données en retour . Tout type d’exemple, d’explication ou de référence serait apprécié. Merci beaucoup d’avance.

Découvrez d’ abord le Guide de programmation réseau de Beej .

Le scénario de base d’une connexion serveur / client se présente comme suit:

  • Le serveur listen() s sur un port fixe, avec un socket donné.
  • Le client se connect() à un port du serveur; le client obtient un socket.
  • Le serveur accept() s la connexion et accept() renvoie un nouveau socket pour la connexion.
  • (Le serveur continue d’écouter le port d’origine avec le socket d’origine.)

Pour la connexion spécifique avec le client, le serveur write() dans la nouvelle socket obtenue lors de l’ accept() la connexion entrante. Un serveur occupé aura beaucoup, beaucoup de sockets, mais il n’aura jamais besoin de bind() à un port. Toutes les connexions arrivent sur ce port, mais la stack de protocoles réseau du système d’exploitation sépare les données et les rend disponibles sur le socket spécifique à la connexion.

Vous n’avez pas besoin d’une nouvelle prise.

Un socket est une connexion duplex vous pouvez envoyer des données dans les deux sens et vous pouvez même fermer le socket dans un sens (vous ne voulez plus écrire), tout en envoyant des données dans l’autre sens.

Votre socket est bidirectionnelle, il n’est donc pas nécessaire de créer une autre socket. Sauf si vous utilisez une sorte de middleware, tel que Pub / Sub, il n’est pas nécessaire de créer un autre socket pour permettre la communication bidirectionnelle.

Techniquement, c’est correct, le socket est en duplex et vous pouvez envoyer les données au même socket que celui que vous avez lu:

  SOCKET s = socket() ... //Connect int size = receive(s,...); //make response send(s, ...); 

Mais dans la pratique, cela dépend de ce que vous allez faire. Il est possible de raccrocher si vous avez la situation suivante:

  1. Le processus 1 envoie de très grandes données (<100K) sur le socket en une seule opération d'envoi

  2. Le processus 2 reçoit les données de 1 par partie et envoie les petits paquets à 1 (~ 20b). Ce n’est pas un

    confirmations, mais quelques événements externes. La situation se passe en bulle, où le tampon d’envoi du 2 est plein et il arrête d’envoyer des confirmations à 1. 2 et 1 sont en train de suspendre leurs opérations d’envoi en créant une impasse. Dans ce cas, je vous recommande d’utiliser deux sockets. Un pour lire, un pour écrire.

(Réponse tardive, donc surtout pour ceux qui viennent ici pour chercher de l’aide)

J’ai récemment mis en place un exemple d’application client / serveur qui suit de près le Guide de la programmation réseau de Beej (également recommandé par Kerrek SB dans sa réponse). Si vous recherchez un exemple simple de communication client / serveur, cela vous aidera peut-être:

https://github.com/countvajhula/dummyclientserver

En particulier, non, votre client n’a pas besoin de configurer un socket d’écoute séparé pour recevoir les données du serveur. Une fois que le serveur a accepté la connexion du client, le serveur peut simplement renvoyer des données au client sur le même socket. .