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.
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, etaccept()
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.
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.
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:
le processus 1 envoie de très grosses données (<100K) sur la socket par un envoi l'opération
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.
(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.