Seite 1 von 2
TCP-Daten empfangen...
Verfasst: 05.02.2012 14:50
von funkheld
Hallo, guten Tag.
Ich spiele mit dem Zugsimulator Zusi2.
Dieser kann Daten versenden über TCP.
Diese Daten möchte ich empfangen mit Purebasic.
Für die Kommunikation zwischen Zusi und dem Server sowie zwischen dem Server und den Clients wird eine TCP-Verbindung zum Port 1435 des Servers aufgebaut. Der Port kann bei eventuellen Problemen auch geändert werden.
Jeder Client meldet sich zunächst am Server an. Zusi sollte sich als letzter Client anmelden (im Allgemeinen sollte das kein Problem darstellen, da man zunächst die "Infrastruktur" aufbaut und dann erst Zusi startet). Die Clients melden sich mit dem Befehl HELLO an und erhalten eine Bestätigung ACK_HELLO. Danach senden die Clients den Befehl NEEDED_DATA und erhalten eine Bestätigung ACK_NEEDED_DATA. Nach der Verbindung mit Zusi sendet der Server NEEDED_DATA mit den Daten aller Clients und erhält von Zusi die Bestätigung ACK_NEEDED_DATA. Wenn diese positiv ist, wartet der Server nun auf DATA-Befehle von Zusi, die er durchsucht und die jeweils benötgten Daten an die anderen Clients verteilt.
Dieses ist der Server der läuft :
TCPserver.exe
Der TCP-Server dient als Verwaltungsserver für Programme, welche die Datenausgabe von Zusi nutzen. Die Datenausgabe dient zur Verständigung zwischen Zusi und externen Programmen. Somit ist es möglich, die aktuellen Führerstandsanzeigen von Zusi auf auszugeben,
Die Server-Exe ist funktionsfähig.
Meine Frage, ich möchte jetzt einmal Daten vom Server empfangen und auf dem Consolefenster ausgeben.
Wer kann mir mal dabei Helfen. Ich bekomme die Kurve dahin nicht.
Danke.
Gruss
Re: TCP-Daten empfangen...
Verfasst: 05.02.2012 14:55
von jojo1541
Ein Anfang wäre es, wenn du die Verbindung zum Server mit OpenNetworkConnection() aufbaust. Den Port weißt du ja und die IP sollte auch bekannt sein. Dann musst du eigentlich nurnoch entsprechend die Befehle senden und die Antworten empfangen. Schau dir einfach mal die Network-Library in der Hilfe an. Da findest du alles, was du brauchst.
Re: TCP-Daten empfangen...
Verfasst: 05.02.2012 15:42
von funkheld
Jup, danke.
Jetzt habe ich gelesen, das Bytewerte übertragen :
// String initialisieren (Beispiel: ACK_HELLO)
myPacket = Chr($00)+Chr($04)+Chr($00)
und auch Byte wieder empfangen werden von Purebasic.
Wie geht das?
Im Beispiel wird ein String versendet und damit kann der Server nichts anfangen, er meldet in seinem Fenster, das er den Client nicht kennt.
Bitte noch einmal um Hilfe.
Danke.
Gruss
Re: TCP-Daten empfangen...
Verfasst: 05.02.2012 15:50
von ts-soft
Code: Alles auswählen
;myPacket = Chr($00)+Chr($04)+Chr($00)
*myPacket = AllocateMemory(3)
PokeB(*myPacket + 1, $04)
Re: TCP-Daten empfangen...
Verfasst: 05.02.2012 18:35
von funkheld
Hmmm.., das Anmelden klappt noch nicht so an den TCP-Server.
Unter Verbindung steht : localhost >>> wo trage ich das denn bei Purebasic ein beim Clienten ?
Port: 1435 >>> die Port-Nr. ist klar !
Code: Alles auswählen
Global Quit.l, Port.l, conID.l, status.l, cEvent.l, Result.l, *DataBuffer.l
*DataBuffer = AllocateMemory(256)
If OpenWindow(0, 10, 10, 500, 320, "Client (kann auch mehrfach gestarted werden)", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
ButtonGadget(1,5, 10,100, 20, "Ende")
ButtonGadget(2,120, 10, 100, 20, "Connect")
ButtonGadget(3,235, 10, 140, 20, "Disconnect")
EditorGadget(4, 10, 40, 480, 270)
SetGadgetText(4, "Dieser Client kann auch mehrfach gestartet werden um damit"+#CR$+"mehrere, gleichzeitige Verbindungen zum Server auf zu bauen.")
Quit = 0
Port = 1435
status = 0
If InitNetwork() = 0
MessageRequester("Info", "Kein Netzwerk !", #PB_MessageRequester_Ok)
End
EndIf
Repeat
EventID.l = WaitWindowEvent(10)
Select EventID
Case #PB_Event_CloseWindow
Quit = 1
Case #PB_Event_Gadget
Select EventGadget()
Case 1
Quit = 1
Case 2
If Not status
conID = OpenNetworkConnection("127.0.0.1", Port)
If conID
status = 1
SetGadgetText(4, GetGadgetText(4) + #CR$ + "- Connected -" + #CR$)
EndIf
EndIf
Case 3
If status <> 0
CloseNetworkConnection(conID)
status = 0
SetGadgetText(4, GetGadgetText(4) + #CR$ + "- Connection closed -" + #CR$)
EndIf
EndSelect
EndSelect
; ----- Netztwerk-Events bearbeiten
If status
cEvent = NetworkClientEvent(conID)
Select cEvent
Case #PB_NetworkEvent_Data
Repeat
Result = ReceiveNetworkData(ConID, *DataBuffer, 256)
SetGadgetText(4, GetGadgetText(4) + PeekS(*DataBuffer, Result))
Until Result < 343
EndSelect
EndIf
Until Quit = 1 Or EventID = #PB_Event_CloseWindow
EndIf
FreeMemory(*DataBuffer)
End
Danke.
Gruss
Re: TCP-Daten empfangen...
Verfasst: 05.02.2012 19:17
von jojo1541
Localhost heißr nichts anderes als dein eigener Pc. sprich 127.0.0.1, also
Code: Alles auswählen
OpenNetworkConnection("127.0.0.1",1435,#PB_Network_TCP)
.
Insofern hast du das schon richtig gemacht.
Ohne den Server kann ich zur Kommunikation selber leider nichts sagen. Wenn du allerdings Bytes verschickst und empfängst, würde ich auch Bytes auslesen. Also PeekB(), nicht PeekS(). Auch wird Result bei einer Bufferlänge von 256 nie 343 sein, da hier nichts aufaddiert wird, sondern jedes mal die gelesenen Bytes eingetragen werden. Also einmal 256 und dann der Rest.
Besser wäre hier ein <> 256. Auch sollte dein Buffer groß genug sein, um alle Daten fassen zu können, um einen overflow zu vermeiden.
Re: TCP-Daten empfangen...
Verfasst: 05.02.2012 20:51
von funkheld
Hallo, wo gibt es ein einfaches Purebasicprogramm, welches als Client und Server zusammen arbeitet ?
Das wird es sein, weil ich erst auf Antwort warten muss und dann sofort senden muss.
Das bekomm ich nicht auf die Reihe und darum klappt die Verbindung nicht, weil ich nur als Client empfange und keine Antwort zurück gebe.
Danke.
Gruss
Re: TCP-Daten empfangen...
Verfasst: 05.02.2012 20:56
von RSBasic
Siehe PB-Hilfe unter "Network". Unten steht:
PureBasic - Network hat geschrieben:
Beispiel
NetworkClient.pb
NetworkServer.pb
Da hast du ein einfaches Client- und Serverprogramm.
Re: TCP-Daten empfangen...
Verfasst: 05.02.2012 21:30
von funkheld
Danke.
Das Problem ist, das ich etwas empfangen muss und dann gleich wieder zurücksenden bzw eine Antwort geben muss mit einem Programm. Dann wieder Daten empfangen muss.
Gruss
Re: TCP-Daten empfangen...
Verfasst: 05.02.2012 21:35
von RSBasic
Das kannst du problemlos machen. Wenn eine Verbindung mit OpenNetworkConnection() hergestellt wurde, dann kannst du mit Hilfe der Variable "Verbindung" ein Paket senden:
Code: Alles auswählen
Verbindung = OpenNetworkConnection([...])
SendNetworkString(Verbindung, "Hallo")
Und der Server kann ebenfalls eine Nachricht senden, nachdem der Client eine Verbindung hergestellt hat:
Code: Alles auswählen
Clientevent = EventClient()
SendNetworkString(Clientevent, "Hallo zurück")