-
Winsock Problem
Hallo ich bin neu gier Grüße euch alle.
ich habe folgendes Problem:
ich sende ein MSGBOX | Hallo vom Client
es kommt hier noch richtig an:
Code:
procedure TServer.Connect;
var
Buffer: Array[0..8192] Of AnsiChar;
iRecv: Integer;
Begin
if (WSAStartup($0202, wsaData) <> 0) then
begin
Writeln('Unable to start winsock, unable to continue');
Readln;
Exit;
end;
Close := False;
repeat
//Prepare a listen socket to be used for our connection
//and declare its host/port information
hSocket := Socket(AF_INET, SOCK_STREAM, 0);
Addr.sin_family := AF_INET;
Addr.sin_port := htons(hPort);
Addr.sin_addr.S_addr := INET_ADDR(PAnsiChar(GetIPFromHost(hHost)));
Writeln('Connecting to ' + GetIPFromHost(hHost));
//Attempt the connection using our socket
if (Winsock.Connect(hSocket, Addr, SizeOf(Addr)) = 0) then
begin
Writeln('Connected to host');
//Notify our connected client of the connection and send
//our information
SendData('ADDNEW|' + UserName + '|' + CompName + '|' + 'Awaiting commands');
//Attempt to receive data from our socket.
ZeroMemory(@Buffer, SizeOf(Buffer));
iRecv := Recv(hSocket, Buffer, SizeOf(Buffer), 0);
while ((iRecv > 0) and (iRecv <> INVALID_SOCKET)) do // <-----------Im Buffer ist alles ok
begin
ReceiveData(hSocket, @Buffer); // <-----------Im Buffer ist alles ok
ZeroMemory(@Buffer, SizeOf(Buffer));
iRecv := Recv(hSocket, Buffer, SizeOf(Buffer), 0);
end;
Und dann der Fehler wo ich nicht weis woran es liegt:
Code:
procedure TServer.ReceiveData(Socket: TSocket; Buffer: PByte);
var
Data: AnsiString;
strArr: TDynStringArray;
begin
//Convert our data to a AnsiString and trim it
Data := AnsiString(Buffer);
Data := Trim(Data); // <-----------Im Buffer Sind nurnoch Fragezeichen
if Length(Data) > 0 then begin // <-----------in Data Sind die Fragezeichen
//Setup our dynamic array structure
StrArr := Explode('|', Data); // <-----------in Data Sind die Fragezeichen
//Display incoming message (if strArr[0] = 'MSGBOX')
if StrArr[0] = 'MSGBOX' then begin
MessageBox(0,PChar(StrArr[1]),'Winsock Example',MB_OK + MB_ICONINFORMATION);
end;
Und die Fragezeichen gehen so durch Explode durch und am ende bei ZeroMemory(@Buffer, SizeOf(Buffer)); ist die Nachricht wieder richtig zusehen im Buffer was ist da dazwischen was falsch ist kann mir da jemand helfen???
ich kann auch den kompletten Text posten bei belieben oder auch das Ganze Projekt auf mein Server hochladen und als Download anbieten mit Client und allem eben.
-
Benutzt du Delphi2009 bzw. 2010?
Falls ja, könnte es ein Unicode-Problem sein.
Ändere mal
Code:
procedure TServer.ReceiveData(Socket: TSocket; Buffer: PByte);
in
Code:
procedure TServer.ReceiveData(Socket: TSocket; Buffer: ansistring);
Und übergib ReceiveData direkt den Buffer und keinen Zeiger.
Dann könnte es funktionieren.
Ansonsten lad am besten mal das ganze Projekt hoch oder lass es mir per PM zukommen, dann schau ich es mir mal genauer an.
-
Ok gut jetzt war ja wiedermal was billiges *gg*
vielen dank echt Cool von dir.
nur da tritt ein weiteres Problem auf meine Frage ist wieso kann ich nicht bei
MessageBox(0,PChar(StrArr[1]),'Winsock Example',MB_OK + MB_ICONINFORMATION)
aus dem PChar ein PAnsiChar machen das kann doch nicht sein ja ich habe 2009 und baue das Projekt um das es läuft mit Unicode aber ich check mit dem Unicode wohl nicht so durch
keine Ahnung bin ich zu doof *gg*
-
Weil MessageBox einen PWideChar erwartet. Dies würde also zu einem Typkonflikt führen.
Korrekt müsste es so aussehen (dann erscheint auch keine Warnung vom Compiler mehr):
Code:
MessageBox(0,PChar(String(StrArr[1])),'Winsock Example',MB_OK + MB_ICONINFORMATION)
(Ich bin jetzt davon ausgegangen, dass StrArr ein Array of AnsiString ist)
Edit:
Wenn du unbedingt die Ansi-Funktionen verwenden möchtest, kannst du auch so etwas wie MessageBoxA nehmen, dann funktioniert es auch mit PAnsiChar.
Davon würde ich dir allerdings abraten, denn wenn du dein Programm Unicode kompatibel machen möchtest, musst du dich auch danach richten.
Deshalb ist es auch eigentlich nicht nötig, in deinem Code überall AnsiString zu benutzen, damit nimmst du dir ja wieder all die Vorteile der Unicode-Strings.
-
Ok na klar supi cool Danke vielmals...
Unicode zeug dahanna *gg*
verdammt geil