AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Netzwerk-Kommunikation zwischen C# und Delphi-Programm
Thema durchsuchen
Ansicht
Themen-Optionen

Netzwerk-Kommunikation zwischen C# und Delphi-Programm

Ein Thema von hsg · begonnen am 22. Nov 2011 · letzter Beitrag vom 22. Nov 2011
Antwort Antwort
Seite 1 von 2  1 2      
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
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.622 Beiträge
 
Delphi 12 Athens
 
#2

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

  Alt 22. Nov 2011, 10:51
Bist Du sicher, dass in C# int einer SmallInt entspricht?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
franktron

Registriert seit: 11. Nov 2003
Ort: Oldenburg
1.446 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#3

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

  Alt 22. Nov 2011, 10:59
Ist es nicht so das .NET Unicode kann dann müssten die Strings doch WideStrings sein oder ?
Frank
Tux sein Lieblingsquellcode
While anzfische<TuxSatt do begin
Fisch:=TFisch.Create; Tux.EssenFisch(Fisch); Fisch.Free;inc(anzfische); end;
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#4

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

  Alt 22. Nov 2011, 11:04
.. und in Delphi besser TLagerInfo = packed record verwenden.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
vagtler

Registriert seit: 9. Jul 2010
Ort: Köln
667 Beiträge
 
Delphi 2010 Professional
 
#5

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

  Alt 22. Nov 2011, 11:11
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...
  Mit Zitat antworten Zitat
hsg

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

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

  Alt 22. Nov 2011, 11:29
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
  Mit Zitat antworten Zitat
mquadrat

Registriert seit: 13. Feb 2004
1.113 Beiträge
 
Delphi XE2 Professional
 
#7

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

  Alt 22. Nov 2011, 11:31
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
  Mit Zitat antworten Zitat
vagtler

Registriert seit: 9. Jul 2010
Ort: Köln
667 Beiträge
 
Delphi 2010 Professional
 
#8

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

  Alt 22. Nov 2011, 11:33
[...] 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
Ähm, aber genau dafür sind die doch absolut prädestiniert?
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#9

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

  Alt 22. Nov 2011, 11:39
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;
  Mit Zitat antworten Zitat
hsg

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

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

  Alt 22. Nov 2011, 12:09
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz