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