![]() |
Daten senden: Client->Server->Client
Hi ihrs!
Kann mir mal jemand helfen: Ich will, dass sich mein Client mit dem Server verbindet, ihm einen Befehl sendet, was zu tun ist und der Server dann dem Clienten antwortet. Mein Server:
Delphi-Quellcode:
Mein Client:
program Project1;
uses Windows, WinSock, Unit1 in 'Unit1.pas'; var wsaData: TWSADATA; T:DWord; s: TSocket; sock: sockaddr_in; conSock: TSocket; Empf: string; senden:string; begin if (WSAStartup(MAKEWORD(2,0),wsaData)) <> 0 then exit; s := Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if s = INVALID_SOCKET then exit; ZeroMemory(@sock, sizeof(sock)); sock.sin_addr.S_addr := INADDR_ANY; sock.sin_family := AF_INET; sock.sin_port := htons(1223); // PORT if (bind(s, sock, sizeof(sock))) = SOCKET_ERROR then exit; if (listen(s, 10)) = SOCKET_ERROR then exit; SetLength(Empf,8192); while true do begin conSock := accept(s, nil, nil); if conSock <> INVALID_SOCKET then begin recv(conSock, Empf[1], 2, 0); if Empf='01'then begin Senden:='Hallo'; send(conSock,Senden[1],Length(Senden),0); end; end; end; end.
Delphi-Quellcode:
Vielen Dank schon mal!
function GetData(const URL: String): string;
var S: TSocket; A: SOCKADDR_IN; W: TWsaData; H: pHostEnt; Senden: String; begin SetLength(result,8192); if WsaStartup(MakeWord(1, 1), W) = 0 then begin H := GetHostByName(PChar(URL)); if H <> nil then begin FillChar(A, SizeOf(A), 0); A.sin_family := AF_INET; A.sin_addr.S_addr := PDWord(H.h_addr_list^)^; A.sin_port := htons(1223); S := Socket(AF_INET, SOCK_STREAM, 0); if S <> INVALID_SOCKET then begin if Connect(S, A, SizeOf(A)) = 0 then begin Senden:='01'; send(S,Senden[1],Length(Senden),0); recv(S, result[1], Length(result), 0); end; CloseSocket(S); end; end; end; WSACleanup; end; |
Re: Daten senden: Client->Server->Client
Wo liegt denn das Problem?
|
Re: Daten senden: Client->Server->Client
Das hab ich wohl vergessen :)
Delphi-Quellcode:
program Project1;
uses Windows, WinSock, Unit1 in 'Unit1.pas'; var wsaData: TWSADATA; T:DWord; s: TSocket; sock: sockaddr_in; conSock: TSocket; Empf: string; senden:string; begin if (WSAStartup(MAKEWORD(2,0),wsaData)) <> 0 then exit; s := Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if s = INVALID_SOCKET then exit; ZeroMemory(@sock, sizeof(sock)); sock.sin_addr.S_addr := INADDR_ANY; sock.sin_family := AF_INET; sock.sin_port := htons(1223); // PORT if (bind(s, sock, sizeof(sock))) = SOCKET_ERROR then exit; if (listen(s, 10)) = SOCKET_ERROR then exit; SetLength(Empf,8192); while true do begin conSock := accept(s, nil, nil); if conSock <> INVALID_SOCKET then begin recv(conSock, Empf[1], 2, 0);//Da liegt es! Der Server wartet hier sich tot! (owohl ich ihm Daten gesendet hab!) if Empf='01'then begin Senden:='Hallo'; send(conSock,Senden[1],Length(Senden),0); end; end; end; end. |
Re: Daten senden: Client->Server->Client
Bin mir nicht sicher, aber evtl. sind die Verbindungen gepuffert. Versuche mal noch ein #10 an deine Strings anzuhängen (bzw. einen flush aufruf, weiß aber nicht ob es so einen gibt bzw. wie der heißt).
|
Re: Daten senden: Client->Server->Client
Nein! Das hilft leider nicht!
|
Re: Daten senden: Client->Server->Client
Das Problem liegt wo ganz anders. Es wird alles richtig empfangen, nur ist dein Verlgeich Empf='01' falsch und damit holt er sich gleich die nächste Verbindung (man sollte den Socket vielleicht auch irgendwo schließen :-). Die kleinste Änderung ist du machst aus deinem recv folgendes:
Delphi-Quellcode:
Und dann klappts...
setlength(empf,recv(conSock, Empf[1], 2, 0));
|
Re: Daten senden: Client->Server->Client
OK! Vielen Dank! Es geht!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:37 Uhr. |
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