Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
TCP Client / Server verstehen sich nicht
Tossi65
myCSharp.de - Member



Dabei seit:
Beiträge: 72

Themenstarter:

TCP Client / Server verstehen sich nicht

beantworten | zitieren | melden

Hallo Leute,
ich muss zum ersten Mal eine Client/ Server Anwendung erstellen. Der Server ist eine Kameraanwendung, welche wir steuern möchten Dazu gibt es Befehlssequenzen,
die UIT16 sind und an die Kamera gesendet werden sollen.

Ich habe mit C# und SimpleTCPCLient Package einen Client erstellt. Die Programme finden sich auch.
Wenn ich nun folgenden Sequenz sende: 01 00 00 00 (Connect) reagiert die Kamera nicht.
Zum Testen benutze ich YAT und baue dazu eben die gleiche Verbindung auf und wenn ich damit die Sequenz sende reagiert die Kamera.

Zum besseren Verständnis habe ich YAT als Serverinstanz aus meinem 2. Testrechner laufen. Ich benutze die gleichen Einstellungen wie für das Kamerasystem. Ich sende mit dem Client die Sequenz(01 00 00 00) und siehe da, auf dem YAT Server sehe ich 01h 00h 00h 00h.
Sende ich nun vom Server die eigentliche Rückantwort(02 00 00 00) empfange ich auf dem Client 30h 32h 20h 30h 30h 20h 30h 30h 20h 30h 30h ????
Das ist die richtige Antwort aber in Byte eigentlich sollte 02h 00h 00h 00h da stehen.

Ich gehe davon aus, das das selbe Problem mit meinem Client und der Kamera besteht.

Ich brauch dringend Hilfe.

Danke Torsten
Danke Tossi
private Nachricht | Beiträge des Benutzers
inflames2k
myCSharp.de - Experte

Avatar #AARsmmPEUMee0tQa2JoB.png


Dabei seit:
Beiträge: 2349

beantworten | zitieren | melden

Bei TCP/IP Kommunikation werden immer Bytes versendet.

Im allgemeinen solltest du mehr erklären. Wir kennen weder die Spezifikation der Kamera, noch weiß ich persönlich was "YAT" ist.
Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager | Spielkartenbibliothek
private Nachricht | Beiträge des Benutzers
dannoe
myCSharp.de - Member



Dabei seit:
Beiträge: 174

beantworten | zitieren | melden

Du kannst auch mit Wireshark nachvollziehen welche Netzwerkpakete über deinen PC verschickt werden. Du musst dann lediglich dieses YAT und dein Programm vergleichen.

Wireshark · Go Deep.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von dannoe am .
private Nachricht | Beiträge des Benutzers
Tossi65
myCSharp.de - Member



Dabei seit:
Beiträge: 72

Themenstarter:

beantworten | zitieren | melden

Ja das mit den Bytes beim versenden ist klar.
Hier ein Auszug aus dem Handbuch:

Zitat:
6.1.2 Aufbau einer Nachricht
Die meisten Nachrichtenelemente sind vom Typ UINT16 und bestehen daher aus 2 Bytes. Da Bytes über Ethernet sukzessive und die Nachrichtenelemente im "Little Endian"-Format übertragen werden, wird das niederwertigste Byte zuerst gesendet.

Jede Nachricht beginnt mit der Nachrichten-ID.

Es gibt drei verschiedene Kategorien von Nachrichten:

1. Nachrichten von BVS Cockpit
a. Statusnachricht
b. Ergebniscontainer

2. Nachrichten an BVS Cockpit ohne Antwort
a. Disconnect
b. Zeitstempel setzen
c. Inputdaten setzen
d. Ergebnisnummer setzen
e. Inspektionsprogramm triggern
f. Inspektionsprogramm starten
g. Inspektionsprogramm anhalten
h. Neustart auslösen
i. Logeintrag schreiben

3. Nachrichten an BVS Cockpit, die dann nach erfolgter Aktion eine Antwort sendet
a. Connect
b. Inspektionsprogramm umschalten
c. Inspektionsprogramm-ID abfragen
d. Zeitstempel holen

Alle Nachrichten haben dieselbe Struktur:
Länge in Bytes Struktur Bezeichnung
2 UINT16 Nachrichten-ID
2 UINT16 Nutzdatenlänge in Bytes
Nutzdaten
Nachrichten, die nicht dem vorgegebenen Format entsprechen (falsche Länge, unbekannte Nachrichten-ID), werden
ignoriert.

Connect
Die Connect-Nachricht stellt eine Verbindung her.
Länge in Bytes Struktur Wert Bezeichnung
2 UINT16 01hex Nachrichten-ID
2 UINT16 00hex Nutzdatenlänge in Bytes
BVS Cockpit antwortet darauf mit ihrer Connect-Nachricht.
Länge in Bytes Struktur Wert Bezeichnung
2 UINT16 01hex Nachrichten-ID
2 UINT16 02hex Nutzdatenlänge in Bytes
2 UINT16 02hex Protokollversion
Die folgenden Beispiele zeigen, wie die Nachrichten aufgebaut sind und wie sie übertragen werden.
Die Nachrichten-ID für Connect ist 01hex, als UINT16, "Little Endian": 01hex 00hex
Dann folgt die Nutzdatenlänge. Die Connect-Nachricht hat keine Nutzdaten, die Länge ist Null. Als UINT16 in "Little Endian" wird dies wie folgt übertragen: 00hex 00hex
Da es keine Nutzdaten gibt, ist die Nachricht fertig.
Der gesamte Connect-Befehl sieht folgendermaßen aus:
01hex 00hex
00hex 00hex
In der Programmiersprache C:
unsigned char[] connect =
{
0 x 01, 0 x 00,
0 x 00, 0 x 00
};
Nachricht vom Client an BVS Cockpit: 01 00 00 00
BVS Cockpit antwortet darauf mit: 01 00 02 00 02 00
Disconnect
Mit der Disconnect-Nachricht wird die Verbindung getrennt. Es werden fortan keine Ergebnis-Container und keine Statusnachrichten mehr gesendet; Nachrichten an BVS Cockpit werden ignoriert.
Länge in Bytes Struktur Wert Bezeichnung
2 UINT16 02hex Nachrichten-ID
2 UINT16 00hex Nutzdatenlänge in Bytes
Beispiel:
Nachricht vom Client an BVS Cockpit: 02 00 00 00

Zitat ende

Also wenn ich "01 00 00 00" senden will dann macht der Client daraus "4849324848324848324848" Byte und auf der Serverseitet sehen ich folgendes "30h 31h 20h 30h 30h 20h 30h 30h 20h 30h 30h 01h 00h 00h 00h". Also nicht was ich sehen will. Die FRage dabei ist doch was meinen die mit UInt16 Format!?!?



Danke Tossi
private Nachricht | Beiträge des Benutzers
dannoe
myCSharp.de - Member



Dabei seit:
Beiträge: 174

beantworten | zitieren | melden

Zeig doch mal etwas Code wie du z. B. die 01 00 00 00 sendest.
Zitat von Tossi65
url: https://sourceforge.net/projects/y-a-terminal/

YAT ist ja sogar in Csharp geschrieben. Dann schau dir doch einfach an wie die es machen
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von dannoe am .
private Nachricht | Beiträge des Benutzers
Tossi65
myCSharp.de - Member



Dabei seit:
Beiträge: 72

Themenstarter:

beantworten | zitieren | melden

Ach übrigends: YAT ist ein Tool mit dem man Client Server testen und nachstellen kann.
url: https://sourceforge.net/projects/y-a-terminal/
Danke Tossi
private Nachricht | Beiträge des Benutzers
inflames2k
myCSharp.de - Experte

Avatar #AARsmmPEUMee0tQa2JoB.png


Dabei seit:
Beiträge: 2349

beantworten | zitieren | melden

Zitat von Tossi65
der Client daraus "4849324848324848324848" Byte

Das wäre ein sehr mehrkwürdiger Byte-Wert. Sicher dass du dort nicht irgendwelche ASCII Zeichen liest?

Versuchen wir mal deine Dezimalen Werte die du als "Byte" annimmst in ASCII umzuwandeln.

Dec. 48 = Hex. 30
Dec. 49 = Hex. 31
Dec. 32 = Hex. 20

Insofern scheint ja zumindest das anzukommen, was du auch versendest. Allerdings ist das was du versendest nicht korrekt. Übrigens verschickst du 11 Bytes und nicht wie Eingangs in der Beschreibung angeführt, 2 die du versenden sollst.

Fragst du nämlich mich sollte dein Byte Array das du versendest folgende Werte haben:
1
0


Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von inflames2k am .
Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager | Spielkartenbibliothek
private Nachricht | Beiträge des Benutzers
Tossi65
myCSharp.de - Member



Dabei seit:
Beiträge: 72

Themenstarter:

beantworten | zitieren | melden

@dannoe


                    Byte[] bytes;
                    bytes = Encoding.UTF8.GetBytes("01 00 00 00");
                    client.Send(bytes);
Ich habe es auch schon mit AScci.Encoding versucht.



@inflames2k
Da liegst du leider nicht richtig. E§s muss die gesamte Sequenz übermittelt werden "01 00 00 00". Das sind dann mit Blanks 11 Zeichen.
Danke Tossi
private Nachricht | Beiträge des Benutzers
dannoe
myCSharp.de - Member



Dabei seit:
Beiträge: 174

beantworten | zitieren | melden

Laut dem Auszug aus deiner Doku darfst du keine Leerzeichen mitschicken:
Zitat
unsigned char[] connect =
{
0 x 01, 0 x 00,
0 x 00, 0 x 00
};

Also analog in C# mit byte als Typ:


// UInt16
var connectSequence = new byte[] { 0x01, 0x00, 0x00, 0x00 };


Das hier ist übrigens Quatsch, damit wandelst du den Text in die zugehörigen UTF8 Byte Darstellung. Und auch mit ASCII wäre es quatsch. Du sollst Zahlen als Bytes schicken und keinen Text in Bytes umwandeln.


Encoding.UTF8.GetBytes("01 00 00 00");


Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von dannoe am .
private Nachricht | Beiträge des Benutzers
inflames2k
myCSharp.de - Experte

Avatar #AARsmmPEUMee0tQa2JoB.png


Dabei seit:
Beiträge: 2349

beantworten | zitieren | melden

Zitat von Tossi65
@inflames2k
Da liegst du leider nicht richtig. E§s muss die gesamte Sequenz übermittelt werden "01 00 00 00". Das sind dann mit Blanks 11 Zeichen.

Und wo genau steht in der Schnittstellenbeschreibung dass du Zeichen übertragen sollst?

Schon die Beschreibung gibt ja her, dass du da was nicht richtig machst:
  • 2 UINT16 01hex Nachrichten-ID
  • 2 UINT16 00hex Nutzdatenlänge

Rechnet man jetzt mal zusammen, wie viele Bytes das ergibt sind wir bei 4 und nicht bei 11.

Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von inflames2k am .
Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager | Spielkartenbibliothek
private Nachricht | Beiträge des Benutzers
dannoe
myCSharp.de - Member



Dabei seit:
Beiträge: 174

beantworten | zitieren | melden

Hier vielleicht etwas verständlicher:


UInt16 messageId = 0x01; // = 1
UInt16 payloadLength = 0x00; // = 0

var messageIdArray = BitConverter.GetBytes(messageId);
var payloadLengthArray = BitConverter.GetBytes(payloadLength);

var connectSequence = new byte[] { messageIdArray[0], messageIdArray[1], payloadLengthArray[0], payloadLengthArray[1] }; // die Arrays könnte man automatisch mergen

private Nachricht | Beiträge des Benutzers
Tossi65
myCSharp.de - Member



Dabei seit:
Beiträge: 72

Themenstarter:

beantworten | zitieren | melden

@dannoe

Das geht super.
Da wäre ich nie drauf gekommen. Die Kamera schickt mir eine Antwort. Diese muss ich nun wieder in einen String zurück wandeln.
;(

Danke Tossi
private Nachricht | Beiträge des Benutzers
inflames2k
myCSharp.de - Experte

Avatar #AARsmmPEUMee0tQa2JoB.png


Dabei seit:
Beiträge: 2349

beantworten | zitieren | melden

Nein du musst gar nichts in einen String umwandeln. Du liest die Bytes und anhand der Werte (Rückumwandlung in UInt16) weißt du, wie die Antwort aussieht.

Was hast denn du die ganze Zeit mit deinen Zeichen / Strings?
Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager | Spielkartenbibliothek
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4029

beantworten | zitieren | melden

Zitat von Tossi65
Da wäre ich nie drauf gekommen. Die Kamera schickt mir eine Antwort. Diese muss ich nun wieder in einen String zurück wandeln.
Mir scheint, dir ist nicht so ganz klar, was Binärdaten sind. Die Herangehensweise mit Strings deutet auf eine falsche Vorstellung davon hin.
Du solltest dich daher mal intensiver mit den Basisdatentypen und deren Konvertierungen beschäftigen, gerade wenn du Client-Server-Programmierung (Protokolle) implementieren willst.
Schau dir besonders mal die beiden Klassen BinaryReader und BinaryWriter an, welche dir bei der Implementierung helfen können.
private Nachricht | Beiträge des Benutzers
Tossi65
myCSharp.de - Member



Dabei seit:
Beiträge: 72

Themenstarter:

beantworten | zitieren | melden

Danke für eure Hilfe. Ja ich werde mich mal mit Datentypen auseinander setzen. Aber jetzt gibt es wieder neue Probleme.

Danke
Danke Tossi
private Nachricht | Beiträge des Benutzers