|
Antwort |
Registriert seit: 15. Jan 2007 Ort: Jena 38 Beiträge Delphi 7 Personal |
#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 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 |
Zitat |
Ansicht |
Linear-Darstellung |
Zur Hybrid-Darstellung wechseln |
Zur Baum-Darstellung wechseln |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
LinkBack URL |
About LinkBacks |