Communication bidirectionnelle dans la programmation de socket en utilisant C

j'ai un petit doute sur la programmation des sockets. je peux envoyer mes données du client au serveur et mon serveur traite les données. Le fonctionnement des données traitées, je veux les renvoyer à mon client. Nous pouvons donc "écrire" les données au client en utilisant la même socket. Je veux dire qu'un serveur écoute sur un port avant d'accepter la connexion et de recevoir des données, alors de la même manière, dois-je faire en sorte que mon client écoute un autre port (le relier à une autre socket) et faire en sorte que mon serveur se connecte à cette socket et transférer les données de nouveau. Tout type d'exemple, d'explication ou de référence serait apprécié. Merci beaucoup à l'avance.

10
demandé sur Luc Danton 2011-07-25 03:26:48

5 réponses

découvrez Guide de programmation réseau de Beej tout d'abord.

voici le scénario de base d'une connexion serveur/client:

  • Serveur listen() s sur un port fixe, avec une socket donnée.
  • Client connect() s vers le port du serveur; le client obtient une socket.
  • Serveur accept()s de la connexion, et accept() retourne un prise de connexion.
  • (le serveur continue écoute sur le port d'origine avec la prise d'origine.)

Pour la connexion avec le client, le serveur write() s à la nouvelle socket qu'il a obtenu quand accept()ing la connexion entrante. Un serveur occupé aura beaucoup, beaucoup de prises, mais il ne sera jamais besoin de bind() à un port. Toutes les connexions sont disponibles sur ce port, mais la pile de protocoles réseau de L'OS sépare les données et les rend disponibles sur la socket spécifique à la connexion.

15
répondu Kerrek SB 2016-10-30 15:46:36

vous n'avez pas besoin d'une nouvelle prise.

une socket est une connexion duplex que vous pouvez envoyer des données dans les deux directions et vous pouvez même fermer la socket d'une direction (ne veut plus écrire) mais tout de même envoyer des données de l'autre direction.

11
répondu Karoly Horvath 2011-07-24 23:29:03

votre socket est bi-directionnel, il n'est donc pas nécessaire de créer une autre socket. À moins que vous n'utilisiez une sorte d'middleware, comme Pub/Sub, il n'est pas nécessaire de créer une autre socket pour permettre la communication bidirectionnelle.

2
répondu 2011-07-25 00:56:57

techniquement, il est juste, la socket est duplex et vous pouvez envoyer les données à la même socket que vous avez lu à partir de:

   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 sortir de la socket, si vous avez la situation suivante:

  1. le processus 1 envoie de très grosses données (<100K) sur la socket par un envoi l'opération

  2. le processus 2 reçoit des données de 1 par portions et envoie de petits paquets à 1 (~20b). Il est pas un

    confirmations, mais quelques événements externes. La situation va dans hangout, où le tampon d'envoi du 2 est plein et il cesse d'envoyer des confirmations à 1. 2 et 1 sont dans une impasse. Dans ce cas, je recommande l'utilisation de deux sockets. L'un pour la lecture, un pour les écrire.

2
répondu Andrey Borisov 2014-11-12 19:02:24

(réponse Tardive, donc principalement pour quelqu'un d'autre qui vient ici 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 Beej à la programmation réseau (qui a également été recommandé par Kerrek SB dans sa réponse). Si vous êtes à la recherche d'un exemple simple et fonctionnel de communication client/serveur, peut-être que cela aidera:

https://github.com/countvajhula/dummyclientserver

En particulier, non, votre le client n'a pas besoin de configurer une socket d'écoute séparée pour recevoir des 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 la même socket.

1
répondu mindthief 2012-11-01 03:49:56