Server--> client String übertragen.
-
Vielen Danke Gruß S.Mathi
-
Folgendes funktioniert:
Es werden jeweils die Trackbar->Position des Servers zum Client sowie
die TrackBar->Position des Clients zum Server übertragen.//----------------------------------------------- // Client IP 192.168.2.101 //----------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { ClientSocket1->Active = false; ClientSocket1->Port = 5000; ClientSocket1->Address = "192.168.2.101"; //IP des Clients oder "localhost" ClientSocket1->Host = "192.168.2.100"; //IP des Servers (Bei gleichem Rechner "localhost" ClientSocket1->Active = true; } //--------------------------------------------------------------------------- void __fastcall TForm1::ClientSocket1Read(TObject *Sender, TCustomWinSocket *Socket) { ClientSocket1->Socket->ReceiveBuf(&a,2); //Daten vom Server Edit1->Text = a; } //--------------------------------------------------------------------------- void __fastcall TForm1::TrackBar1Change(TObject *Sender) { test = TrackBar1->Position; Edit1->Text = TrackBar1->Position; ClientSocket1->Socket->SendBuf(&test,2); //Daten zum Server } //------------------------------------------------------- // SERVER IP 192.168.2.100 //------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { ServerSocket1->Active = false; ServerSocket1->Port = 5000; ServerSocket1->Active = true; } //--------------------------------------------------------------------------- void __fastcall TForm1::ServerSocket1ClientConnect(TObject *Sender, TCustomWinSocket *Socket) { Form1->Edit1->Text = "CONNECT"; //Sobald der Client startet tritt das Ereigniss auf Edit4->Text = Socket->RemoteAddress; //IP des Client Host } //--------------------------------------------------------------------------- void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender, TCustomWinSocket *Socket) { Socket->ReceiveBuf(&test,2); //Daten vom Client Edit2->Text = test; } //--------------------------------------------------------------------------- void __fastcall TForm1::TrackBar1Change(TObject *Sender) { test = TrackBar1->Position; ServerSocket1->Socket->Connections[0]->SendBuf(&test,2); //Daten zum Client }Was mich allerdings noch interssieren würde, wie kann ich bei einem Connect
eines Clients dessen IP ermitteln?
Und wie ist es wenn noch ein weiterer Client mit IP 192.168.2.102 Port 5000
nutzt und der Server nun unterschiedliche Daten an Client 192.168.2.101 oder 192.168.2.102 senden möchte
-
Vielen Danke für Ihre Code.

Gruß Mathi
-
hermes schrieb:
Was mich allerdings noch interssieren würde, wie kann ich bei einem Connect
eines Clients dessen IP ermitteln?
Und wie ist es wenn noch ein weiterer Client mit IP 192.168.2.102 Port 5000
nutzt und der Server nun unterschiedliche Daten an Client 192.168.2.101 oder 192.168.2.102 senden möchteDie Clients werden alle im ServerSocket gespeichert. ServerSocket1->Socket->Connections[index] (oder so ähnlich). Darüber kannst du alles ermitteln was du möchtest.
Alternativ kannst du im OnClientConnect-Event das TCustomSocket Objekt nutzen. (Ist aber in diesem Fall kein Array sondern nur EIN Client, nämlich der Verbindende)
-
Ihalt aus der Borland Hilfe.
Was muss ich da wie tun?TSocketNotifyEvent ist der Typ für Ereignisbehandlungsroutinen, die auf Ereignisse während der Erzeugung oder Verwendung einer Socket-Verbindung reagieren.
typedef void __fastcall (__closure *TSocketNotifyEvent)(System::TObject* Sender, TCustomWinSocket* Socket);
Beschreibung
Der Parameter Sender ist die Socket-Komponente oder das Windows-Socket-Objekt, zu dem die Ereignisbehandlungsroutine gehört.
Der Parameter Socket ist das TCustomWinSocket-Objekt, das den Endpunkt der Verbindung repräsentiert.
Wenn die Ereignisbehandlungsroutine zu einem Client-Windows-Socket-Objekt gehört, sind diese beiden Parameter identisch. Bei Server-Windows-Socket-Objekten, repräsentiert der Parameter Sender die wartende Verbindung, während der Parameter Socket die Client-Verbindung repräsentiert.
-
Hast du im OnClientConnect-Event schon mal folgendes probiert?
//--------------------------------------------------------------------------- void __fastcall TForm1::ServerSocket1ClientConnect(TObject *Sender, TCustomWinSocket *Socket) { Socket-> //und jetzt mal warten bis die Code-Completion kommt }Hast du dir auch mal die Eigenschaften von TCustomWinSocket angesehn?
-
Alles klar, es wird ja der Zeiger auf den Socket der Klasse TCustomWinSocket
übergeben.
HWND handle; //Handle Instanz erzeugen//--------------------------------------------------------------------------- void __fastcall TForm1::ServerSocket1ClientConnect(TObject *Sender, TCustomWinSocket *Socket) { Edit1->Text = "CONNECT"; Client_IP->Text = Socket->RemoteAddress; Index->Text = Socket->LocalPort; handle = Socket->Handle; }Ich finde das die Borland Hilfe manchmal mehr verwirrt als hilft.
Vielen Dank
-
hermes schrieb:
//--------------------------------------------------------------------------- void __fastcall TForm1::ServerSocket1ClientConnect(TObject *Sender, TCustomWinSocket *Socket) { ... handle = Socket->Handle; }Wofür machst du das?
-
Ich dachte ich kann über den Handle auf WIN API Funktionen zugreifen.
Noch eine Frage zur Borland Hilfe.
typedef void __fastcall (__closure *TSocketNotifyEvent)(System::TObject* Sender, TCustomWinSocket* Socket);
Was heisst
(__closure *TSocketNotifyEvent)Und ich habe immer noch keine Möglichkeit gefunden den Index zu bekommen.
-
so schicke ich an alle clients die selbe nachricht
for(int x=0;x<UserAnzahl;x++) { ServerSocket1->Socket->Connections[x]->SendText(Message); }über ServerSocket1->Socket->Connections[x]->.. kannst du an einenbestimmten user die nachricht schicken..
jedesmal wenn ein user sich beim server anmeldet kommt er automatisch dort rein.
ich habe aber noch ne Listbox gemacht, wo alle IPs abgespeichert werden, so kann ich über die listbox und oben gennanter code die user einfach auseinander halten und ansprechen(gibt aber probleme bei gleicher ips von verschiedenen clienten)[edit] UserAnzal ist bei mir ein int wobei bei "clientconnect" UserAnzahl++ und bei "clientdisconnect" UserAnzahl-- gerechnet wird
-
Ich wiederhole mich wirklich nur ungern, aber ich glaube ihr solltet euch unbedingt ALLE Eigenschaften von TServer-/TClientSocket ansehen. Und zwar bis ins kleinste Detail. Weil mitzählen ist nicht nötig, das macht der ServerSocket nämlich ebenfalls! Der Server hält alle wichtigen Informationen die es braucht um die Clients zu verwalten.
Zu closure musst du mal die Hilfe befragen. Eins ist jeden Fall klar, dass
typedef void __fastcall (__closure *TSocketNotifyEvent)(System::TObject* Sender, TCustomWinSocket* Socket);ist ein Funktionspointer.
Rückgabewert:__closure TSocketNotifyEvent
Parameter: TObject und TCustomWinSocket*