Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Daten senden: Client->Server->Client (https://www.delphipraxis.net/21134-daten-senden-client-server-client.html)

SleepyMaster 28. Apr 2004 12:27


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:
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.
Mein Client:
Delphi-Quellcode:
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;
Vielen Dank schon mal!

fiasko 28. Apr 2004 12:37

Re: Daten senden: Client->Server->Client
 
Wo liegt denn das Problem?

SleepyMaster 28. Apr 2004 12:43

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.

fiasko 28. Apr 2004 12:48

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).

SleepyMaster 28. Apr 2004 12:54

Re: Daten senden: Client->Server->Client
 
Nein! Das hilft leider nicht!

fiasko 28. Apr 2004 16:45

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:
setlength(empf,recv(conSock, Empf[1], 2, 0));
Und dann klappts...

SleepyMaster 14. Mai 2004 12:16

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