Zwei-Wege-Kommunikation in Socket-Programmierung mit C

8

Ich habe ein paar Zweifel in der Socket-Programmierung. Ich kann meine Daten vom Client zum Server senden und mein Server verarbeitet die Daten. Das o / p der verarbeiteten Daten möchte ich an meinen Kunden zurücksenden. So können wir die Daten mit demselben Socket auf den Client zurückschreiben. Ich meine, ein Server lauscht auf einem Port, bevor er die Verbindung annimmt und Daten empfängt, also muss ich auch meinen Client auf einen anderen Port hören lassen (einen anderen Socket binden) und meinen Server mit diesem Socket verbinden und die Daten zurückübertragen . Jede Art von Beispiel oder Erklärung oder Referenzen wären willkommen. Vielen Dank im Voraus.

    
user537670 24.07.2011, 23:26
quelle

5 Antworten

13

Sehen Sie sich zuerst Beejs Netzwerkprogrammierungshandbuch an.

Das grundlegende Drehbuch einer Server / Client-Verbindung lautet wie folgt:

  • Server listen() s an einem festen Port mit einem bestimmten Socket.
  • Client connect() s an einen Serverport; Client erhält einen Socket.
  • Server accept() s die Verbindung und accept() gibt einen neuen Socket für die Verbindung zurück.
  • (Der Server hört weiterhin den ursprünglichen Port mit dem ursprünglichen Socket ab.)

Für die spezifische Verbindung mit dem Client hat der Server write() s den neuen Socket erhalten, wenn accept() die eingehende Verbindung erreicht hat. Ein beschäftigter Server wird viele, viele Sockets haben, aber es wird immer nur bind() zu einem Port brauchen. Alle Verbindungen kommen an diesen einen Port, aber der Netzwerkprotokollstapel des Betriebssystems trennt die Daten und stellt sie am verbindungsspezifischen Socket zur Verfügung.

    
Kerrek SB 24.07.2011 23:31
quelle
11

Sie brauchen keinen neuen Socket.

Ein Socket ist eine Duplex-Verbindung, die Daten in beide Richtungen senden kann. Sie können sogar den Socket aus einer Richtung schließen (wollen nicht mehr schreiben), senden aber trotzdem Daten aus der anderen Richtung.

    
Karoly Horvath 24.07.2011 23:29
quelle
1

Ihr Socket ist bidirektional, sodass Sie keinen weiteren Socket erstellen müssen. Sofern Sie keine Middleware wie Pub / Sub verwenden, müssen Sie keinen weiteren Socket erstellen, um die bidirektionale Kommunikation zu ermöglichen.

    
user195488 25.07.2011 00:56
quelle
1

Technisch ist es richtig, der Socket ist Duplex und Sie können die Daten an den gleichen Socket senden, aus dem Sie gelesen haben:

%Vor%

Aber in der Praxis kommt es darauf an, was Sie tun werden. Es ist möglich, Socket auszuhängen, wenn Sie die folgende Situation haben:

  1. Prozess 1 sendet sehr große Daten (& lt; 100K) über den Socket mit einem Send Operation

  2. Prozess 2 empfängt Daten von 1 nach Portionen und sendet kleine Pakete an 1 (~ 20b). Es ist kein

    Bestätigungen, aber einige externe Ereignisse. Die Situation geht in Hangout, wo der Sendepuffer der 2 voll ist und es keine Bestätigungen mehr an 1 sendet. 2 und 1 hängen in ihren Sendeoperationen und machen einen Deadlock. In diesem Fall würde ich empfehlen, zwei Sockets zu verwenden. Eine zum Lesen, eine zum Schreiben.

Andrey Borisov 12.11.2014 19:02
quelle
0

(Späte Antwort, also hauptsächlich für jeden anderen, der hier nach Hilfe sucht)

Ich habe kürzlich eine Client / Server-Beispielanwendung auf den Markt gebracht, die Beejs Leitfaden zur Netzwerkprogrammierung genau befolgt (was auch von Kerrek SB in seiner Antwort empfohlen wurde). Wenn Sie nach einem einfachen Arbeitsbeispiel für die Client / Server-Kommunikation suchen, hilft Ihnen das vielleicht:

Ссылка

Insbesondere, nein, Ihr Client muss keinen separaten abhörenden Socket einrichten, um Daten vom Server zu empfangen - nachdem der Server die Verbindung vom Client akzeptiert hat, kann der Server einfach Daten zurück zum Client senden der gleiche Sockel.

    
mindthief 01.11.2012 03:49
quelle

Tags und Links