![]() |
Netzwerk-Kommunikation zwischen C# und Delphi-Programm
Hallo zusammen,
ich kämpfe gerade an einem Projekt, bei dem ich eine Netzwerk-Kommunikation zwischen einem Server und Client schreibe. Die zu übertragenden Daten wollte ich dabei in einem Record hinterlegen und diesen Record über eine Socket-Verbindung durchs Netzwerk schicken. Die Server-Seite soll ein nettes kleines Delphi-Programm übernehmen, die Client-Seite wird eine C#-Applikation mit dem Compact-Framework 3.5 (ist für ein Windows Mobile 6.5 Gerät). Mittlerweile habe ich auch es soweit hinbekommen, dass Client und Server sich miteinander verbinden können und der Client den gefüllten Struct an den Server schickt. Der Server empfängt auch Daten, doch leider ist der Inhalt des Records irgendwie zerschossen. Was geht da schief???? So, hier der Stoff für die Glaskugel: Client-Seite (c#):
Code:
mit
TLagerInfo rDaten;
int nCount; byte[] cText; unsafe { rDaten = new TLagerInfo(); rDaten.Befehl = Constants.BEF_LOGIN; cText = new System.Text.ASCIIEncoding().GetBytes(User); nCount = Math.Min(cText.Length, 25); for (int i = 0; i < nCount; i++) rDaten.login[i] = cText[i]; cText = new System.Text.ASCIIEncoding().GetBytes(Password); nCount = Math.Min(cText.Length, 25); for (int i = 0; i < nCount; i++) rDaten.passwd[i] = cText[i]; cText = new System.Text.ASCIIEncoding().GetBytes(clPools.Keys[Pool - 1]); nCount = Math.Min(cText.Length, 25); for (int i = 0; i < nCount; i++) rDaten.pool[i] = cText[i]; byte[] buffer = new byte[sizeof(TLagerInfo)]; fixed (Byte* pBuffer = buffer) *((TLagerInfo*)pBuffer) = rDaten; oSocket.Send(buffer, buffer.Length, SocketFlags.None); }
Code:
Die Serverseite sieht so aus:
struct TLagerInfo {
public int Befehl; unsafe public fixed byte login[25]; unsafe public fixed byte passwd[25]; unsafe public fixed byte pool[40]; };
Delphi-Quellcode:
mit
nRead := Socket.ReceiveBuf(rEmpf,sizeof(TLagerInfo));
if nRead = SizeOf(TLagerInfo) then begin if oLog <> nil then begin oLog.Add('Client: ' + Socket.RemoteHost); oLog.Add('Befehl : ' + IntToStr(rEmpf.Befehl)); oLog.Add('Name : ' + rEmpf.login); oLog.Add('Pw: ' + rEmpf.passwd); oLog.Add('Pool: ' + rEmpf.pool); oLog.Add('==================='); end; // if oLog <> nil end;
Delphi-Quellcode:
Daten, die ich im Client schicke:
TLagerInfo = record
Befehl : SmallInt; login : string[25]; passwd : string[25]; pool : string[40]; end; Befehl: 1 Login: jo.hoyer Passwd: ih Pool: Produktiv-Kablow_D Ankommen tut im Server folgendes: Befehl: 1 Login: Passwd: Pool: roduktiv-Kablow_D (nein, dass Passwort ist nicht mein normales Passwort :-D) Visual Studio sagt mir, dass im gesendeten Buffer die Ascii-Codes der Zeichen korrekt drinstehen. Wie bekomme ich meinen Record korrekt ausgelesen? Gruß Jörg |
AW: Netzwerk-Kommunikation zwischen C# und Delphi-Programm
Bist Du sicher, dass in C# int einer SmallInt entspricht?
|
AW: Netzwerk-Kommunikation zwischen C# und Delphi-Programm
Ist es nicht so das .NET Unicode kann dann müssten die Strings doch WideStrings sein oder ?
|
AW: Netzwerk-Kommunikation zwischen C# und Delphi-Programm
.. und in Delphi besser
Delphi-Quellcode:
verwenden.
TLagerInfo = packed record
Grüße Klaus |
AW: Netzwerk-Kommunikation zwischen C# und Delphi-Programm
Warum eigentlich nicht einen stinknormalen Webservice nehmen und diesen ganzen Kommunikationsoverhead den Frameworks überlassen? Damit hätte man die komplette Problematik innerhalb einer halben Stunde erschlagen...
|
AW: Netzwerk-Kommunikation zwischen C# und Delphi-Programm
So, wo fange ich an?
Mit dem SmallInt und int habe ich lange experimentiert. Ich bekomme im Server genauso viel Bytes, wie mein Record groß ist. Habe vorher auch andere Kombinationen ausprobiert, dann waren aber Anzahl der im Server ankommenden Zeichen unterschiedlich zu meiner Record-Länge. (ReceiveLength <> sizeof(TLagerInfo). Die Urpsrungsstruktur im C#-Teil war mal char, das ist aber Unicode und damit doppelt so groß wie im Delphi. Freund google lieferte mir dann die Konvertierung
Code:
Damit habe ich hier tatsächlich "normale" ASCII-Zeichen (und damit kein WideString)
cText = new System.Text.ASCIIEncoding().GetBytes(User);
Packed Record ändert die Ausrichtung der einzelnen Felder und damit auch die Größe des Records (bei meinen Experimenten hatte ich auch packed Records verwendet, aber dann war die Größe statt 96 Bytes 95 und da wusste ich nicht, wie ich das C# beibringe. Wie gesagt: Im Ausgehenden Buffer auf der Client-Seite finde ich auch meine Eingaben wieder (wenn auch als ASCII-Werte), nur der Eingang sieht sie nicht :? Warum kein Webservice: Das ganze wird eine eigenständige Applikation auf einem speziellen Pocket-PC (Motorola MC75A) sein, welche die Entnahme von Lagerteilen mit dem ERP-System synchronisiert. Mit einer sehr bunten Oberfläche :lol: |
AW: Netzwerk-Kommunikation zwischen C# und Delphi-Programm
Hast du dir auch mal die Bytes angeschaut, die du auf der Delphi-Seite kriegst? Passen die? Also sprich: Ist die Übertragung fehlerhaft, oder das wandeln in den Record?
@Webservice Es ging um einen Service, nicht um eine Web-Anwendung. Stichworte SOAP, REST |
AW: Netzwerk-Kommunikation zwischen C# und Delphi-Programm
Zitat:
|
AW: Netzwerk-Kommunikation zwischen C# und Delphi-Programm
In Pascal wird in den Shortstrings auch die Längenangabe gespeichert. Sinnvolle Deklarationen wären also (nachdem die Ausrichtung geklärt ist):
Delphi-Quellcode:
TLagerInfo = record
Befehl : longint; login : array[0..24] of byte; passwd : array[0..24] of byte; pool : array[0..39] of byte; end; //oder TLagerInfo = record Befehl : longint; login : array[0..24] of ansichar; passwd : array[0..24] of ansichar; pool : array[0..39] of ansichar; end; |
AW: Netzwerk-Kommunikation zwischen C# und Delphi-Programm
Zitat:
Noch mal das Thema Webservice: Ich muss gestehen, dass ich mich mit diesem Thema nicht groß auseinander gesetzt habe. Damit wäre das Thema genauso Neuland für mich, wie es das C# und Compact-Framework sowieso schon ist. Falls ich demnächst Zeit finde, werde ich mich eventuell auch mit dem Thema Webservice beschäftigen, aber im Moment wollte ich mich auf das eine Thema konzentrieren. Gruß Jörg |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz