Hier ist meine Situation ist:Asynchron, anerkannt, Punkt-zu-Punkt-Verbindung gSOAP mit
- Ich habe eine
wsdl
, "übersetzt" in eine Header-Datei wie folgt aus:wsdl2h -o file.h file.wsdl
- Dann ausgeführt ich
soapcpp2 -Icorrect_path -j file.h
- On "Server-Seite" ich den Dienst implementiert, wieder unter Verwendung von
soapXXXService.[h|cpp]
- On "Server-Seite", verwendete ich
soap_init2
(mitSOAP_IO_KEEPALIVE
), ich habesoap_bind
,soap_accept
,soap_copy
usw. und es scheint völlig in Ordnung zu arbeiten (siehe unten) - On „Client-Seite“, verwende ich die erzeugte
proxy
Objekt (wiederSOAP_IO_KEEPALIVE
verwenden), um die Nachricht konstruieren und sie an den Server - senden Der "Server" empfängt diese Nachricht und sendet zurück ACK (benutzerdefinierte
XML
) - 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:
- Client sendet Anfrage an den Server
- Server gibt ACK als Antwort zurück e (wie die Standard-ACK) - Signale Anfrage
- später erfolgreich empfangen, sendet der Server Antwort an den Client (das ist die wirkliche Antwort)
- 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 ACK
SIND SOAP-Nachrichten.
Ich denke, ich verstehe jetzt. Ich ziehe meine erste Antwort herunter. –
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. –
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. –