Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Problem mit WinSocket's - Keine Verbindung zum Server? (https://www.delphipraxis.net/86994-problem-mit-winsockets-keine-verbindung-zum-server.html)

engel90 21. Feb 2007 22:24


Problem mit WinSocket's - Keine Verbindung zum Server?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
da ich noch nicht so bewandert bin in der Winsocket-Programmerung wollte ich einen kleinen Chat schreiben. Dabei habe ich jedoch folgendes Problem:

Immer wenn der Client erfolgreich zum Server connected hat und ich dann ein MNachricht eingebe udn auf Send klick bringt mir das Programm folgende Fehlermeldung:
"Windows socket error: Eine Anforderung zum Senden oder Empfangenvon Daten wurde verhindert, da der Socket nicht verbunden ist und (beim Senden über ein Datagrammsocket mit einem sendto-Aufruf) keine Addresse angegeben wurde (10057), on API 'recv'"
Ich weiß nciht was diese Fehlermeldung bedeutet :wiejetzt:


Mein Programm:

Unit1.pas:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Winsock, StdCtrls, Buttons, Unit2, Unit3;

type
  TForm1 = class(TForm)
    BtnDecisionServer: TSpeedButton;
    BtnDecisionClient: TSpeedButton;
    Label1: TLabel;
    FrameServer1: TFrameServer;
    FrameClient1: TFrameClient;
    BtnExit: TSpeedButton;
    procedure BtnDecisionClientClick(Sender: TObject);
    procedure BtnDecisionServerClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure BtnExitClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{Funktion gibt lokale IP-Adresse aus}
function LocalIP:string;
var
  WSA : TWSAData;
  ILen : integer;
  PHst : PChar;
  PHEn : PHostEnt;
begin
  WSAStartup( $0101, WSA );
  ILen := $FF;
  PHst := StrAlloc( ILen );
  gethostname( PHst, ILen );
  PHEn := gethostbyname( PHst );

  with PHEn^ do result:=format(
   '%d.%d.%d.%d',
   [ord(h_addr^[ 0 ]), ord(h_addr^[ 1 ]),
   ord(h_addr^[ 2 ]), ord(h_addr^[ 3 ])]
  );

  {Nuke the string}
  StrDispose( PHst );

  {Dust and Clean}
  WSACleanup;
end;

procedure TForm1.BtnDecisionClientClick(Sender: TObject);
begin
  Form1.Caption := 'XChat - Client';
  Form1.FrameClient1.Visible := True;
  Form1.FrameServer1.Destroying;
end;

procedure TForm1.BtnDecisionServerClick(Sender: TObject);
begin
  Form1.Caption := 'XChat - Server';
  Form1.FrameServer1.Visible := True;
  Form1.FrameClient1.Destroying;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Form1.FrameServer1.LblServerAdress.Caption := LocalIP;
end;

procedure TForm1.BtnExitClick(Sender: TObject);
begin
  Application.Terminate;
end;

end.
Unit2.pas:

Delphi-Quellcode:
uses Unit1;

{$R *.dfm}

{Prüfen auf die Aktivität des Servers und danach Buttons aktivieren/deaktivieren}
procedure set_status;
begin
  Form1.FrameServer1.BtnStartServer.Enabled := not Form1.FrameServer1.ServerSocket.Active;
  Form1.FrameServer1.BtnStopServer.Enabled := Form1.FrameServer1.ServerSocket.Active;
end;

procedure TFrameServer.BtnExitClick(Sender: TObject);
begin
  ServerSocket.Close;
  Application.Terminate;
end;

{Server starten}
procedure TFrameServer.BtnStartServerClick(Sender: TObject);
begin
  ServerSocket.Port := 5531;
  ServerSocket.Open;
  LblServerStartTime.Caption := TimeToStr(now);
  set_status;
end;

{Server stoppen}
procedure TFrameServer.BtnStopServerClick(Sender: TObject);
begin
  ServerSocket.Socket.SendText('Die Verbindung zum Server ' + LblServerAdress.Caption + ':' + IntToStr(ServerSocket.Port) + ' wurde unterbrochen');
  ServerSocket.Close;
  LblServerStartTime.Caption := '';
  LblServerClients.Caption := '0';
  set_status;
end;

{Clients-Lable und Verbundene IP's setzen, wenn sich ein Client verbindet}
procedure TFrameServer.ServerSocketClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
  connected_clients:   Integer;
begin
  connected_clients := ServerSocket.Socket.ActiveConnections;
  LblServerClients.Caption := IntToStr(connected_clients);
  connected_clients := connected_clients - 1;
  MemoConnectedClients.Lines.Add(ServerSocket.Socket.Connections[connected_clients].RemoteHost + ' - ' + ServerSocket.Socket.Connections[connected_clients].RemoteAddress);
  set_status;
end;

{Wenn ein Client eine Nachricht schreibt wird sie vom Server an alle anderen Clients gesendet}
procedure TFrameServer.ServerSocketClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  ServerSocket.Socket.SendText(ServerSocket.Socket.ReceiveText);
end;

{Wenn die Verbindung zu einem Client getrennt wird soll das Programm seine IP aus dem Memo löschen}
procedure TFrameServer.ServerSocketClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  {not aviable}
  LblServerClients.Caption := IntToStr(ServerSocket.Socket.ActiveConnections);
end;

end.
Unit3.pas:

Delphi-Quellcode:
unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ScktComp, StdCtrls, ExtCtrls, Buttons;

type
  TFrameClient = class(TFrame)
    BtnConnect: TSpeedButton;
    BtnDisconnect: TSpeedButton;
    BtnExit: TSpeedButton;
    Bevel1: TBevel;
    MemoMessages: TMemo;
    EditMessage: TEdit;
    BtnSendMessage: TSpeedButton;
    EditNickname: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    LblStatus: TLabel;
    ClientSocket: TClientSocket;
    procedure BtnExitClick(Sender: TObject);
    procedure BtnConnectClick(Sender: TObject);
    procedure ClientSocketConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);
    procedure BtnDisconnectClick(Sender: TObject);
    procedure BtnSendMessageClick(Sender: TObject);
    procedure ClientSocketDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

implementation

uses Unit1;

{$R *.dfm}

{Prüfen auf die Aktivität des Clients und danach Buttons aktivieren/deaktivieren}
procedure set_status;
begin
  Form1.FrameClient1.BtnConnect.Enabled := not Form1.FrameClient1.ClientSocket.Active;
  Form1.FrameClient1.BtnDisconnect.Enabled := Form1.FrameClient1.ClientSocket.Active;

  Form1.FrameClient1.BtnSendMessage.Enabled := Form1.FrameClient1.ClientSocket.Active;
  Form1.FrameClient1.EditMessage.Enabled := Form1.FrameClient1.ClientSocket.Active;
  Form1.FrameClient1.EditNickname.Enabled := not Form1.FrameClient1.ClientSocket.Active;
end;

procedure TFrameClient.BtnExitClick(Sender: TObject);
begin
  Application.Terminate;
end;

procedure TFrameClient.BtnConnectClick(Sender: TObject);
begin
  with ClientSocket do begin
       Address := InputBox('Server IP-Adresse', 'Bitte geben sie die IP-Adresse des Servers ein:', '');
       Port := 5531;
       Open;
  end;
  set_status;    
end;

procedure TFrameClient.ClientSocketConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  LblStatus.Caption := 'Verbunden';
  MemoMessages.Lines.Add('[' + TimeToStr(now) + '] Verbindung zu ' + Clientsocket.Address + ' erfolgreich hergestellt');
  ClientSocket.Socket.SendText('[' + TimeToStr(now) + '] ' + EditNickname.Text + ' betritt den Raum');
  set_status;
end;

procedure TFrameClient.ClientSocketRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  MemoMessages.Lines.Add(ClientSocket.Socket.ReceiveText);
end;

procedure TFrameClient.BtnDisconnectClick(Sender: TObject);
begin
  with ClientSocket do begin
       Close;
  end;
  MemoMessages.Lines.Add('Verbindung getrennt');
  set_status;
end;

procedure TFrameClient.BtnSendMessageClick(Sender: TObject);
begin
  ClientSocket.Socket.SendText('[' + TimeToStr(now) + '] ' + EditNickname.Text + ': ' + EditMessage.Text);
  set_status;
end;

procedure TFrameClient.ClientSocketDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  ClientSocket.Socket.SendText('[' + TimeToStr(now) + '] ' + EditNickname.Text + 'hat den Raum verlassen');
end;

end.
Anmerkung:
- Unit1.pas -> Fenster zu Auswahl zwischen Server und Client
- Unit2.pas -> Server-Frame
- Unit3.pas -> Client-Frame

Gruß
engel90


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:48 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