 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
arduno
Anmeldungsdatum: 12.05.2011 Beiträge: 252
|
Verfasst am: 15.02.2012, 10:21 Titel: Verbindung mit TCP vom Zusi2-Lokemulator aufnehmen. |
|
|
Mit welchen Mitteln kann man dieses Programm in Freebasic realisieren ?
Es ist ein Client, der Vebindung zum Server aufnimmt mit Daten und dann auf eine Antwort wartet.
Ich würde mich freuen wenn mich einer mal da genau hinsteuert und welche Programmversion ich wo runterladen kann für die Funktionsverbindung Client zum Server mit Antwort entgegennehmen.
Danke.
Gruss
Code: |
Global sData.l,rData.l,verb.l,offs.l,zeile.s, n.l
Global *sbuffer.l, *rbuffer.l
Declare daten_send_empf()
Declare daten_empf()
*sbuffer = AllocateMemory(256)
*rbuffer = AllocateMemory(256)
If InitNetwork() = 0
End
EndIf
verb = OpenNetworkConnection("127.0.0.1", 1435)
Debug "verb: " + Str(verb)
Debug ""
If verb
offs = 0 ; HELLO-Befehl
PokeL(*sbuffer + 0, $0D) : offs + 4
PokeA(*sbuffer + 4, $00) : offs + 1
PokeA(*sbuffer + 5, $01) : offs + 1
PokeA(*sbuffer + 6, $01) : offs + 1
PokeA(*sbuffer + 7, $02) : offs + 1
client$ = "Fahrpult"
PokeA(*sbuffer + 8, Len(client$)) : offs + 1
PokeS(*sbuffer + 9, client$,-1, #PB_Ascii) : offs + Len(client$)
daten_send_empf()
offs=0 ; NEEDED_DATA-Befehl , Befehlsvorrat 00 0A Geschwindigkeit/Motordrehzahl/Fahrstufe
PokeL(*sbuffer + 0, $06) : offs + 4
PokeA(*sbuffer + 4, $00) : offs + 1
PokeA(*sbuffer + 5, $03) : offs + 1
PokeA(*sbuffer + 6, $00) : offs + 1
PokeA(*sbuffer + 7, $0A) : offs + 1
PokeA(*sbuffer + 8, $01) : offs + 1
PokeA(*sbuffer + 9, $09) : offs + 1
daten_send_empf()
offs=0 ; NEEDED_DATA-Befehl , Befehlsvorrat 00 00
PokeL(*sbuffer + 0, $04) : offs + 4
PokeA(*sbuffer + 4, $00) : offs + 1
PokeA(*sbuffer + 5, $03) : offs + 1
PokeA(*sbuffer + 6, $00) : offs + 1
PokeA(*sbuffer + 7, $00) : offs + 1
daten_send_empf()
weiter:
daten_empf()
Delay(10)
Goto weiter
CloseNetworkConnection(verb)
EndIf
End
Procedure daten_send_empf()
Debug ""
sData = SendNetworkData(verb, *sbuffer, offs)
Debug "sData: " + Str(sData)
rData = ReceiveNetworkData(verb, *rbuffer, 256)
Debug "rData: " + Str(rData)
zeile$ = ""
For n = 0 To rData - 1
zeile$ = zeile$ + RSet(Hex(PeekA(*rbuffer + n)), 2, "0")
If n < rData - 1
zeile$ = zeile$ + ":"
EndIf
Next n
Debug zeile$
EndProcedure
Procedure daten_empf()
Debug ""
rData = ReceiveNetworkData(verb, *rbuffer, 256)
Debug "rData: " + Str(rData)
zeile$ = ""
For n = 0 To rData - 1
zeile$ = zeile$ + RSet(Hex(PeekA(*rbuffer + n)), 2, "0")
If n < rData - 1
zeile$ = zeile$ + ":"
EndIf
Next n
Debug zeile$
EndProcedure
|
|
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 15.02.2012, 10:46 Titel: |
|
|
Mit TSNE sollte es funktionieren.
Ein Client beispiel ist dort auch vorhanden.
Im Grunde brauchst du dieses client beispiel nur an deine Bedürfnisse anpassen.
Sollte nicht weiter schwer sein, da die Sources sich ziemlich ähneln.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
arduno
Anmeldungsdatum: 12.05.2011 Beiträge: 252
|
Verfasst am: 15.02.2012, 13:24 Titel: |
|
|
Wie kann ich jetzt zb so einen Buffer senden.
Ich sehe im Beispiel nur ein Text der versendet wird.
Ich brauche als erstes 4 0-Stellen und dann die Werte.
Danke.
Code: |
PokeL(*sbuffer + 0, $00) : offs + 4
PokeA(*sbuffer + 4, $00) : offs + 1
PokeA(*sbuffer + 5, $01) : offs + 1
PokeA(*sbuffer + 6, $01) : offs + 1
PokeA(*sbuffer + 7, $02) : offs + 1
client$ = "Fahrpult"
PokeA(*sbuffer + 8, Len(client$)) : offs + 1
PokeS(*sbuffer + 9, client$, -1, #PB_Ascii)
offs + Len(client$)
;Länge der Daten
PokeL(*sbuffer + 0, offs - 4)
|
|
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 15.02.2012, 13:29 Titel: |
|
|
arduno hat Folgendes geschrieben: | Code: |
PokeL(*sbuffer + 0, $00) : offs + 4
PokeA(*sbuffer + 4, $00) : offs + 1
PokeA(*sbuffer + 5, $01) : offs + 1
PokeA(*sbuffer + 6, $01) : offs + 1
PokeA(*sbuffer + 7, $02) : offs + 1
|
|
Naja... Im grunde ist TEXT auch nichts anderes als ein Speicherbereich, der Daten beinhaltet.
Du könntest einen Speicher reservieren:
Code: | Dim SBuffer as String |
Diesem mit Leerem Text füllen, um ihn auf deine gewünschte größe zu vergrössern
Code: | SBuffer = Space(8) '8Bytes |
und dann dort die Werte rein Schreiben
Code: | SBuffer[0] = &H00
'... |
alternativ ginge es auch via Chr()
Code: | Dim SBuffer as String
SBuffer = Chr(&H00, &H00, &H00, &H00, &H00, &H01, &H01, &H02)
|
Oder in der Kompakteren Variante
Code: | Dim SBuffer as String = Chr(&H00, &H00, &H00, &H00, &H00, &H01, &H01, &H02)
|
Anschliessend kannst du die Variable SBuffer einfach via TSNE_Data_Send übertragen
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
arduno
Anmeldungsdatum: 12.05.2011 Beiträge: 252
|
Verfasst am: 15.02.2012, 13:35 Titel: |
|
|
Jup, danke.
Wo finde ich jetzt diese : TSNE_V3.5 Release
Ich habe nur die 3er.
Danke.
Gruss |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
|
Nach oben |
|
 |
arduno
Anmeldungsdatum: 12.05.2011 Beiträge: 252
|
Verfasst am: 15.02.2012, 14:13 Titel: |
|
|
Au danke, jetzt kommen Daten zurück vom Zusi2 aber hier als String.
Wie kann ich jetzt die Daten vom String als einzelne Bytewerte printen.
Die Länge habe ich schon mit "Len" rausbekommen.
Mit dem String selbeer kann ich nichts anwenden nur mit dem Bytewert.
danke.
Gruss |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 15.02.2012, 14:18 Titel: |
|
|
Naja, wie schon zuvor geschrieben, ist ein String nichts anderes als eine verkettugn von Bytewerten.
Du kannst auf die Einzelnen ByteWerte im String mithilfe dessen Pointer verändern, auslesen, manipulieren.
Code: | Print String[adresse] |
Sieht dann z.B. so aus, wenn mal alle Bytes ausgeben möchte
Code: | Dim T as String = "Hallo"
For X as UInteger = 1 to Len(T)
Print T[X - 1]; " ";
Next
Print
|
Gibt dir den Dezimalcode (0-255) jedes Bytes aus.
Wichtig ist nur darauf zu achten, das man nicht über die maximale anzahl Bytes im String hinaus adressiert.
Code: | Dim T as String = "ABCD"
Print T[0] 'A
Print T[1] 'B
Print T[2] 'C
Print T[3] 'D
Print T[4] 'Hier würde es krachen
|
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
arduno
Anmeldungsdatum: 12.05.2011 Beiträge: 252
|
Verfasst am: 15.02.2012, 14:38 Titel: |
|
|
Jup, danke.
Die Daten die zurück sollen stimmen alle.
Der Client funktioniert also wunderbar.
Jetzt nach dem ersten Senden des Clienten und dem Empfang der ersten Daten sendet der Server weitere Datensätze zwischen 12 und 128 Byte die ich auswerten muss. So ca 20x pro Sekunde.
Wie bekomme ich das jetzt hin mit dem Clienten-Befehl ?
Das ist der Befehl zum Senden:
myClient.senden(SBuffer)
Code: |
Dim As connectionType myClient = "Client"
Do
Sleep 30, 1
myClient.senden(SBuffer)
Loop Until InKey = Chr(27)
|
Wie muss ich jetzt nur die Datenpakete abfragen ?
Es soll ja jetzt in der Do-Loop noch andere Sachen gemacht werden.
Und es sollen ja keine Datensätze verloren gehen.
Gibt es da irgendwie ein Event oder wie kann man das hinbekommen ?
Danke.
Gruss |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 15.02.2012, 14:52 Titel: |
|
|
Nun ... TSNE ist ein sogenanntes Ereigniss gesteuertes Modul.
Das Bedeutet, das Durch eintreten von bestimmten ereignissen Bestimmte dinge ausgeführt werden.
Welche dinge das sind, wird vom Programmierer Definiert.
Es gibt 2 Arten von ereignisse. Das erste ist das, welches durch einen Benutzer ausgeführt wird.
Das zweite ist jedes, das vom gegenüber (dem anderem computer) ausgeführt wird.
Zu 1.
Du startest ein sebstgeschriebens Programm. Daraufhin ruft dieses Programm die Funktion TSNE_Create_Client auf. Dies ist ein Benutzerereigniss.
TSNE erzeugt daraufhin eine verbindung und bereitet noch einige andere digne im hintergrund für den datenempfang vor.
Zu 2.
Ist z.B. die Verbidnugn hergestellt worden, dann ruft TSNE eine Sub-Routine auf, welche zuvor in TSNE_Create_Client definiert wurde (In Client-Beispiel ist dies TSNE_Connected())
In dieser Routine kann dann wiederum der Programmierer seinen eigenen Code hinein schreiben, welcher ausgeführt werden soll, wenn dieses ereigniss eingetreten ist.
Das Gleiche vorgehen ist beim Disconnect oder beim empfang neuer Daten möglich.
Wenn du also ständig neue Daten von einem Server erhällst, wird beim empfang dieser automatisch die TSNE_NewData Sub Routine aufgerufen.
Hier kannst du folglich alles machen, das passieren soll, wenn daten eingehen.
Nebenbei kannst du natürlich auch eine Hauptschleife nach dem TSNE_Create_Client ausführen.
Diese läuft parallel zu alle anderen Ereignissen ab.
Du kannst also Daten in dieser Do-Loop schleife versenden, wärend du gleichzeitig Daten empfängst.
Du kannst auch in der NewData Sub routine daten verschicken, wenn du es magst. es gibt prinzipiell keine Einschränkungen was die handhabung angeht.
Der unterschied zu vielen anderen Netzwerk-Modulen ist die Ereigniss steuerung.
Für manache mag dies ein nachteil sein, für TSNE ist es jedoch ein riesiger vorteil.
So muss man z.B. nicht ständig überprüfen, ob neue Daten vorhanden sind, da TSNE selbstständig die Routine aufruft, ohen das der Programmierer sich damit auseinander setzen muss.
Daten verlohren gehen kann es prinzipiell nicht, wenn du sie nicht ignorierst.
Wie schon geschrieben, ruft TSNE generell bei jedem neu empfangenem Datensatz die entsprechende Routine auf.
Möchtest du z.B. diese Daten in deiner Haupt Do-Loop verarbeiten könntest du folgendermassen vorgehen:
Code: |
Dim Shared Global_Daten as String
'verbindung erzeugen ...
Do
If Global_Daten <> "" Then 'wenn neue daten in der global variable
Print Global_Daten '... dann ausgeben
GlobalDaten = "" '... udn variable leeren
End If
sleep 10, 1 'kurz warten
Loop
'Die ampfangsroutine
Sub TSNE_New_Data(V_TSNEID as UInteger, ByRef V_Data as String)
Global_Daten += V_Data 'die daten einfach an eine globale variable anhängen
End Sub
|
Allerdings empfehle ich dir, wenn möglich, die auswertung direkt in der Empfänger routine vorzunehmen. es ist schneller, und code-freundlicher.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
arduno
Anmeldungsdatum: 12.05.2011 Beiträge: 252
|
Verfasst am: 15.02.2012, 16:32 Titel: |
|
|
Ein neues Empfangsproblem und Sendeproblem.
Zu erst wird dieses gesendet:
myClient.senden(hello_data)
dann wird auf Daten gewartet, erst wenn die Daten da sind geht es hier weiter:
myClient.senden(needed_data)
dann wird wieder auf Daten gewartet, erst wenn die Daten da sind geht es hier weiter:
myClient.senden(needed_data1)
dann wird wieder auf Daten gewartet, erst wenn die Daten da sind geht es hier weiter:
Dann erst kommt die Schleife, wo die Daten dauernd empfangen werden:
Wie kann man das schreiben in einer Schleife ?
Danke.
Gruss |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 15.02.2012, 16:36 Titel: |
|
|
das kannst du z.B. über eienn Globale Statusvariable lösen.
Code: | Dim shared G_Status as UInteger
'verbindungsaufbau
'empfangs sub
sub tsne_new_data(...)
Select Case G_Status
case 0
tsne_data_send("hallo! wa gibts?")
g_status = 1
case 1
tsne_data_send("hab verstanden! sosnt noch was?")
g_status = 2
case 2
tsne_data_send("ok. und sonst?")
g_status = 3
case 3
tsne_data_send("jetzt reichts! zurück zu 1")
g_status = 1
End Select
End Sub
|
so in der art könnte man es realisieren.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 15.02.2012, 16:48 Titel: |
|
|
Es mag helfen, wenn du erwähnst, woher du den Code hast:
Client-Beispiel
Server-Beispiel
Dann kann man sich besser vorstellen, was der Code eigentlich macht. |
|
Nach oben |
|
 |
arduno
Anmeldungsdatum: 12.05.2011 Beiträge: 252
|
Verfasst am: 15.02.2012, 16:54 Titel: |
|
|
Jup, da ist der Client her .
Danke.
Gruss |
|
Nach oben |
|
 |
arduno
Anmeldungsdatum: 12.05.2011 Beiträge: 252
|
Verfasst am: 16.02.2012, 10:30 Titel: |
|
|
Ein problem beim mehrmaligen senden mit Rückantwort.
Zu erst wird dieses gesendet:
myClient.senden(hello_data)
dann wird auf Daten gewartet, erst wenn die Daten da sind geht es weiter.
Das funktioniert komischerweise nur in einer Schleife (mehrmaliger Aufruf), wenn ich den Aufruf vor einer Schleife einmal mache, kommt keine Verbindung zustande.
Hier beim 2 Datensatz versenden bekomme ich keine Antwort vom Server : myClient.senden(needed_data1).
Ist der Client zu Träge mit dem Empfang ?
Wenn ich das bei Purebasic mache , bekomme ich gleich eine Antwort:
Code: |
; HELLO-Befehl
PokeL(*sbuffer + 0, $0D)
PokeA(*sbuffer + 4, $00)
PokeA(*sbuffer + 5, $01)
PokeA(*sbuffer + 6, $01)
PokeA(*sbuffer + 7, $02)
client$ = "Fahrpult"
PokeA(*sbuffer + 8, Len(client$))
PokeS(*sbuffer + 9, client$,-1, #PB_Ascii)
SendNetworkData(verb, *sbuffer, 17)
; NEEDED_DATA-Befehl , Befehlsvorrat 00 0A
PokeL(*sbuffer + 0, $06)
PokeA(*sbuffer + 4, $00)
PokeA(*sbuffer + 5, $03)
PokeA(*sbuffer + 6, $00)
PokeA(*sbuffer + 7, $0A)
PokeA(*sbuffer + 8, $01)
PokeA(*sbuffer + 9, $09)
SendNetworkData(verb, *sbuffer, 10)
; NEEDED_DATA-Befehl , Befehlsvorrat 00 00
PokeL(*sbuffer + 0, $04)
PokeA(*sbuffer + 4, $00)
PokeA(*sbuffer + 5, $03)
PokeA(*sbuffer + 6, $00)
PokeA(*sbuffer + 7, $00)
SendNetworkData(verb, *sbuffer, 8)
|
Danke.
GRuss
Zuletzt bearbeitet von arduno am 16.02.2012, 11:26, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 16.02.2012, 10:38 Titel: |
|
|
Nutze mal Wireshark oder Etherreal, Ethercap und analysiere den datenverkehr, der ausgeht. Vergleiche ihn mit beiden Programmen. Ich habe das Gefühl, das der Datensatz nicht stimmen könnte.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
arduno
Anmeldungsdatum: 12.05.2011 Beiträge: 252
|
Verfasst am: 16.02.2012, 11:30 Titel: |
|
|
Das ist die Antwort vom Purebasicprogramm.
sData ist gesendete Anzahl, rData ist die empfangene Anzahl und die Daten die ich empfangen habe und diese stimmen.
Komisch ist, das die Verbindung in Freebasic nur durch einen mehrmaligen Aufruf zustande kommt und der 2. Aufruf , wenn der erste beantwortet wurde dann nicht mehr ankommt.
Zitat: |
verb: 33623496
sData: 17
rData: 7
03:00:00:00:00:02:00
sData: 10
rData: 7
03:00:00:00:00:04:00
sData: 8
rData: 7
03:00:00:00:00:04:00
|
|
|
Nach oben |
|
 |
arduno
Anmeldungsdatum: 12.05.2011 Beiträge: 252
|
Verfasst am: 04.03.2012, 19:32 Titel: |
|
|
TSNE_V3.5 :
Ich möchte ein Server betreiben und 2 Clienten.
Ich weiss nicht wie ich das mit TSNE_V3.5 realisieren kann?
Der Server soll Daten zum Client1 senden für den Start , damit der Client1 anschliessend dauernd Daten sendet. Der Server soll diese empfangen und dann sofort immer zum Client2 senden. Für mich irgendwie nicht durchführbar, ich finde den Weg nicht.
Kann man mal kurz ein Minibeispiel bringen dafür.
Danke.
Gruss |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|