Einzelnen Beitrag anzeigen

hsg

Registriert seit: 24. Apr 2006
Ort: Wustermark
354 Beiträge
 
Delphi 10.3 Rio
 
#1

Netzwerk-Kommunikation zwischen C# und Delphi-Programm

  Alt 22. Nov 2011, 10:43
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 )

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
  Mit Zitat antworten Zitat