![]() |
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:
Unit2.pas:
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.
Delphi-Quellcode:
Unit3.pas:
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.
Delphi-Quellcode:
Anmerkung:
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. - 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 03:27 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