Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Netzwerk-Kommunikation zwischen C# und Delphi-Programm (https://www.delphipraxis.net/164622-netzwerk-kommunikation-zwischen-c-und-delphi-programm.html)

hsg 22. Nov 2011 09:43

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:
                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);
                }
mit
Code:
    struct TLagerInfo {
        public int Befehl;
        unsafe public fixed byte login[25];
        unsafe public fixed byte passwd[25];
        unsafe public fixed byte pool[40];
    };
Die Serverseite sieht so aus:
Delphi-Quellcode:
    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;
mit
Delphi-Quellcode:
  TLagerInfo = record
    Befehl : SmallInt;
    login  : string[25];
    passwd : string[25];
    pool   : string[40];
  end;
Daten, die ich im Client schicke:
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

DeddyH 22. Nov 2011 09:51

AW: Netzwerk-Kommunikation zwischen C# und Delphi-Programm
 
Bist Du sicher, dass in C# int einer SmallInt entspricht?

franktron 22. Nov 2011 09:59

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 ?

Klaus01 22. Nov 2011 10:04

AW: Netzwerk-Kommunikation zwischen C# und Delphi-Programm
 
.. und in Delphi besser
Delphi-Quellcode:
TLagerInfo = packed record
verwenden.

Grüße
Klaus

vagtler 22. Nov 2011 10:11

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...

hsg 22. Nov 2011 10:29

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:
cText = new System.Text.ASCIIEncoding().GetBytes(User);
Damit habe ich hier tatsächlich "normale" ASCII-Zeichen (und damit kein WideString)

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:

mquadrat 22. Nov 2011 10:31

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

vagtler 22. Nov 2011 10:33

AW: Netzwerk-Kommunikation zwischen C# und Delphi-Programm
 
Zitat:

Zitat von hsg (Beitrag 1137303)
[...] 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:

Ähm, aber genau dafür sind die doch absolut prädestiniert?

gammatester 22. Nov 2011 10:39

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;

hsg 22. Nov 2011 11:09

AW: Netzwerk-Kommunikation zwischen C# und Delphi-Programm
 
Zitat:

Zitat von gammatester (Beitrag 1137307)
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 ansichar;
    passwd : array[0..24] of ansichar;
    pool  : array[0..39] of ansichar;
  end;

Ich habe die Ansichar-Variante ausprobiert. Damit funktioniert es. Danke für den Hinweis.

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.
Seite 1 von 2  1 2      

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