Sockets mehrfach nutzen

Vom Front-End bis SOAP.

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Sockets mehrfach nutzen

Beitrag von Jan »

Hallo,

die Frage ist eine Anfängerfrage. Ich gestehe, Sockets sind nicht so ganz mein Ding. Ich hoffe, das Ihr mir da etwas auf die Sprünge helfen könnt.

Es geht um folgendes: Ich baue eine Connection auf, die ich dann hinterher für mehrere Requests nutzen muß. Das sieht dann so aus:

Code: Alles auswählen

(Alle Variablen sind vorab als LOCAL deklariert worden)
nSocket := SocketNew(AF_INET, SOCK_STREAM, 0, @nError)
lSuccess := SocketConnect(nSocket, , "192.168.3.250", 8009, @nError)

cText      := DerZuSendeneString
nRueckgabe := SocketSend(nSocket, cText, , , @nError)
DO WHILE cBuffer <> Chr(0)
   cBuffer := SocketRecvStr(nSocket, 1, @nError)
   cRueckgabe += cBuffer
ENDDO

cRueckgabe := ""
cBuffer    := ""
cText      := DerZuSendeneString
nRueckgabe := SocketSend(nSocket, cText, , , @nError)
DO WHILE cBuffer <> Chr(0)
   cBuffer := SocketRecvStr(nSocket, 1, @nError)
   cRueckgabe += cBuffer
ENDDO
nError ist grundsätzlich 0 bei allen entsprechenden Positionen.

Beim ersten Request bekomme ich den gewünschten Response. Beim zweiten bleibt der grundsätzlich in der Do-While-Schleife im SocketRecvString() stehen. Egal was ich da abgeschickt habe.

Was mache ich da falsch?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Sockets mehrfach nutzen

Beitrag von Tom »

Fehlen da nicht ein SocketClose oder Disconnect?
Herzlich,
Tom
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Sockets mehrfach nutzen

Beitrag von Jan »

Tom,

wo denn? Wie gesagt, ich muß auf der zuerst erstellten Verbindung mehrere Requests abschicken. Z. B. mich an dem Gerät authentifizieren, Daten senden, Daten abfragen, etc.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Sockets mehrfach nutzen

Beitrag von Tom »

Keine Ahnung, ich arbeite nicht direkt mit Sockets. Ich sehe aber ein Connect am Anfang Deiner Routine. Wenn Du die nochmal aufrufst und es gibt vorher keinen Aufruf einer Gegenfunktion, dürfte der Socket dicht sein.
Herzlich,
Tom
Benutzeravatar
HaPe
1000 working lines a day
1000 working lines a day
Beiträge: 995
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz
Hat sich bedankt: 17 Mal
Danksagung erhalten: 15 Mal

Re: Sockets mehrfach nutzen

Beitrag von HaPe »

Hallo Jan !
Keine Ahnung, ich arbeite nicht direkt mit Sockets.
Ich schon, aber nicht mit Xbase++ :roll:

Hier die allgemeine Vorgehensweise wenn man mit Sockets arbeitet:

Code: Alles auswählen

UPDClient in VC

Was                                                 Funktion
-------------------------------------------------------------------------------------------------------------------------------------------
WinSock starten                                     WSAStartup()                                                       INIT der Form
UDP-Socket erstellen                                socket()
Info fürs Ziel einstellen                           memset() + htons() + inet_addr() + gethostbyname() + memcpy()
Dauerschleife                                       while
    Zeichenfolge eingeben und versenden             gets() + sendto()
    Zeichenfolge empfangen                          recvfrom()
Ende der Schleife
Socket wieder schließen                             closesocket()
WinSock wieder entladen                             WSACleanup()                                                       DESTROY der Form
-------------------------------------------------------------------------------------------------------------------------------------------


UPDServer in VC

Was                                                 Funktion
-------------------------------------------------------------------------------------------------------------------------------------------
WinSock starten                                     WSAStartup()                                                       INIT der Form
UDP-Socket erstellen                                socket()
Parameter für Socket setzen                         memset() + htons()
Socket an Port binden                               bind()
Dauerschleife                                       while
    Zeichenfolge empfangen                          recvfrom()
    Zeichenfolge versenden                          sendto()
Ende der Schleife
Socket wieder schließen                             closesocket()
WinSock wieder entladen                             WSACleanup()                                                       DESTROY der Form
-------------------------------------------------------------------------------------------------------------------------------------------
Bei meinen Testprogrammen wird das Socket beim Verbinden mit dem Server erstellt und erst wieder beim Disconnect released.
Dazwischen können sehr viele Daten in den UPD/TCP/... Päckchen ausgetauscht werden :badgrin:
--
Hans-Peter
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Sockets mehrfach nutzen

Beitrag von Jan »

Hallo Hans-Peter,

nun, das was Du im Schlußsatz schreibst ist eigentlich das, was ich brauche: Socket öffnen, n Pakete senden und empfangen, Socket schließen. Klappt aber nicht. Immer nur mit einem Paket.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Sockets mehrfach nutzen

Beitrag von Werner_Bayern »

Servus Jan,

bei uns sieht der Verbindungsaufbau so aus:

Code: Alles auswählen

      snSocket := SocketNew(AF_INET, SOCK_STREAM,, @nFehler)
      if .not. snSocket == INVALID_SOCKET .and. SocketConnect(snSocket, AF_INET, aWaagen[1], val(aWaagen[2]), @nFehler)
         oStatus:setCaption("Verbindung erfolgreich!")
und dann wichtig:

Code: Alles auswählen

SocketSetBlockingMode(snSocket, .f.)
Anschließend arbeiten wir mit

Code: Alles auswählen

SocketRecv()
So hat man die volle Kontrolle über die Daten und Wartezeiten. Die Verbindung bleibt oft den ganzen Tag offen, das ist kein Problem.
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Sockets mehrfach nutzen

Beitrag von Jan »

Hallo Werner,

Danke für den Hinweis. Hilft aber nichts. Jetzt läuft der zwar weiter durch die Schleife, aber empfangen tut der trotzdem nichts.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: Sockets mehrfach nutzen

Beitrag von Wolfgang Ciriack »

Richtiges Protokoll ?
Viele Grüße
Wolfgang
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Sockets mehrfach nutzen

Beitrag von ramses »

Hallo Jan

bist du sicher dass dein gegenüber nach der ersten Antwort die du erhältst die Verbindung nicht beendet.
Du schreibst nicht was hinter 192.168.3.250 ist.
Ich kenne das von Geräten. Da muss für jede Abfrage die Verbindung neu erstellt werden.
Das Gerät Connected dann Empfängt es die Anforderung dann Antwortet es und beendet die Verbindung.

Du müsstest also vor jedem Send die Verbindung neu erstellen.
Valar Morghulis

Gruss Carlo
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Sockets mehrfach nutzen

Beitrag von Jan »

Carlo,

da müssen mehrere zusammengehörige Requests über einen Socket laufen. So verstehe ich die Doku. Wobei ich deswegen schon den Support angemailt habe. Die brauchen aber erfahrungsgemäß mindestens mehrere Tage (ein Ticket bei denen läuft schon seit dem 6. Januar).

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Antworten