2013-04-10 16 views
9

Hier ist meine Situation ist:Asynchron, anerkannt, Punkt-zu-Punkt-Verbindung gSOAP mit

  1. Ich habe eine wsdl, "übersetzt" in eine Header-Datei wie folgt aus: wsdl2h -o file.h file.wsdl
  2. Dann ausgeführt ich soapcpp2 -Icorrect_path -j file.h
  3. On "Server-Seite" ich den Dienst implementiert, wieder unter Verwendung von soapXXXService.[h|cpp]
  4. On "Server-Seite", verwendete ich soap_init2 (mit SOAP_IO_KEEPALIVE), ich habe soap_bind, soap_accept, soap_copy usw. und es scheint völlig in Ordnung zu arbeiten (siehe unten)
  5. On „Client-Seite“, verwende ich die erzeugte proxy Objekt (wieder SOAP_IO_KEEPALIVE verwenden), um die Nachricht konstruieren und sie an den Server
  6. senden Der "Server" empfängt diese Nachricht und sendet zurück ACK (benutzerdefinierte XML)
  7. Der "Client" erhält die ACK und alles ist völlig in Ordnung.

Also, was ich jetzt tun möchte, ist der „Server“ machen Rückkehr der „echte“ Antwort auf den „Client“ und dem „Client“ hat einen ACK auf den „Server“ zurückzukehren.

Wie ist das möglich? (es sollte sein)


"Was haben Sie versucht?"

Zwei Dinge kommen mir in den Sinn.

Die erste besteht darin, den Dateideskriptor des Sockets, der von soap_accept zurückgegeben wurde, irgendwie erneut zu verwenden, um die "echte Antwort" zurück an den Server zu senden. Aber ist das überhaupt möglich?
Unix-Sockets sind Vollduplex, das ist technisch möglich, aber beschränkt gSoap dies? Weil ich in der Dokumentation nichts davon gesehen habe. Die zweite Option, die mir in den Sinn kommt, besteht darin, denselben "Dienst" im "Client" zu erstellen, um es zu ermöglichen, Nachrichten (die "echte Antwort") zu empfangen und ACK auf die gleiche Art und Weise zurückzugeben im "Server". Das würde aber bedeuten, dass der "Server" auch eine Instanz des Objekts proxy haben muss, um diese so genannte "echte Antwort" senden zu können.
Und das klingt wirklich hässlich und schrecklich für mich. Nicht, dass ich überrascht sein würde, wenn dies die einzige Option ist, aber ..

Edit: für die zweite Option - das würde bedeuten, dass der Client einen Listener-Port haben sollte, sollte eingehende Verbindungen, etc. Handle nicht klingen wie ein Kunde zu mir ..


ich verstehe, dass ich einige grundlegende Teil fehlen dürfen (n), wie gSoap funktioniert, aber ich lese die ganze user documentation und die "getting started" guide und ich habe nichts gefunden darüber.

Bitte, lassen Sie mich wissen, wenn etwas


EDIT nicht klar ist: Hier ist das Szenario, will ich erreichen:

  1. Client sendet Anfrage an den Server
  2. Server gibt ACK als Antwort zurück e (wie die Standard-ACK) - Signale Anfrage
  3. später erfolgreich empfangen, sendet der Server Antwort an den Client (das ist die wirkliche Antwort)
  4. der Client liefert ACK wieder - Signale empfangen erfolgreich Antwort

Und dieses Szenario könnte auch in die entgegengesetzte Richtung gehen: Server könnte auch Anfrage an den Client senden. Das würde bedeuten - das gleiche Szenario wie oben, aber ersetzen "Client" < -> "Server".

HINWEIS: beide request/response und ACKSIND SOAP-Nachrichten.

+0

Ich denke, ich verstehe jetzt. Ich ziehe meine erste Antwort herunter. –

+0

Fragen zu den Punkten 1, 2 und 3. Benötigen Sie Ihren Kunden, um seine Anfrage zu senden, ein schnelles "Ack", dann in der Lage sein zu gehen und andere Dinge tun, und dann später überprüfen, ob es die empfangen hat endgültige Antwort? Wenn dies der Fall ist, können Sie stattdessen Ihren Client Multithread machen und die erste "Bestätigung" beseitigen. Lassen Sie die Anfrage senden und warten Sie auf die endgültige Antwort auf einen Arbeitsthread, während der Hauptthread des Clients weiterhin nützliche Arbeit leistet. –

+0

Frage zu Punkt 4. Warum wird die Bestätigung vom Client zum Server benötigt? Wenn es benötigt wird, kann dies durch den Abschnitt 7.4 der GSOAP-Dokumentation gehandhabt werden. –

Antwort

2

Ich implementierte es mit option 2 in meiner Frage. Das heißt: Implementieren Sie den Dienst (einen Listener) und verwenden Sie den Proxy (für das Senden von Anfragen) in beiden - dem Client und dem Server. Auf diese Weise, ich habe folgendes:

  1. Der Server liegt
  2. Der Client gestartet (startet einen Zuhörer, auch bekannt als"Service")
  3. Der Client sendet SOAP Anfrage (mit Proxy Objekt), um den Server zu sagen: "Ich bin und meine Lage ist xxx" (xxx ist der URI, der wird verwendet, um den Server an den Client des Zuhörers zu verbinden)
  4. der Server Antworten mit SOAP Nachricht (ACK) (sagen: "OK, ich sehe dich jetzt vorhast"
  5. Later)
  6. die Server sendet SOAP-Anfrage (über Proxy Objekt) an den Client, mit dem Standort, in der ersten Nachricht empfangen; diese Anforderung ist die wirkliche Antwort der Anfrage Dies sagt in 3. gesendet -
  7. The Client kehrt Antwort auf diese Anforderung (ACK) "mit Ihnen OK, ich bin bereit zu kommunizieren" (sagen: "OK, cool")

und auf diese Weise, die beide - der Client als auch der Server kennen die Lage jedes andere, beide haben einen Hörer (Implementierung des Dienstes), beide Proxy-Objekte pflegen.


Scheint, wie dies für mich arbeiten wird. Ich würde mich freuen, wenn jemand mir eine andere Option geben oder etwas über option 1 in meiner Frage sagen würde.


EDIT: Nach dem Tief Forschung für mehrere Tage und nach dem gründlichen Analyse des Protokolls I Absicht umzusetzen, so schien es, dass dies der einzige Weg, dies zu tun:

Implementations MUST in der Lage sein, sowohl als SOAP-Client als auch als SOAP-Server zu fungieren