Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[Borland C++] TCP server

Pagina: 1
Acties:
  • 232 views sinds 30-01-2008
  • Reageer

  • Santo
  • Registratie: December 2007
  • Laatst online: 06-03 20:52
Ik ben met Borland C++ een chat programma aant maken, maar ik loop al vast met de communicatie..
Voor dit programma maak ik gebruik van het indy component IdTCPServer...
De mijn plan was dus 1 server te laten draaien, waar alle clients op kunnen connecten en alles heen kunnen sturen, dat deze het afhandelt en dan naar alle clients terug stuurd, maar daat ligt juist het probleem..

De clients sturen een Ln naar de server, deze ontvangt hij ook.. hij kan dan ook wat terug sturen, maar dat doet hij dus alleen naar de persoon die het verstuurd heeft en niet naar alle geconnectte clients....

Weet iemand hoe ik dit aan moet pakken of heeft er iemand een voorbeeld..?

Zelf heb ik al heel google afgezocht en van alles geprobeert.. Alvast bedankt..

Fijne feestdagen ;) ,
Santo...

Verwijderd

Lang geleden ooit zoiets gedaan, weleenswaar met delphi, maar wel met de indy components.

Je kan het ongeveer zo aanpakken:

Op moment dat een client connect sla je de sockethandle op in een array... wel in de gaten houden dat je 'm erweer uitgooit wanneer de client disconnect.

Op moment dat je iets wilt sturen naar alle clients loop je gewoon die array af en stuur je het naar alle socket connecties die er op dat moment zijn.

Kan je niet gedetailleerder helpen... tis te lang geleden voor mij.

  • Santo
  • Registratie: December 2007
  • Laatst online: 06-03 20:52
ja ik het het al geprobeert om het ip adres op te slaan van de clients, maar is dat hetzelfde als de sockethandle :$?

maar ik wist niet hoe ik kan kiezen naar welk ip hij het dan verstuurd...

Verwijderd

Nee sockethandle is niet hetzelfde als ip adres.... Je moet maar eens de indy documentatie gaan lezen, aangezien zij dat vast veel beter kunnen uitleggen dan ik.

Je hoeft in principe niet het ip adres op te slaan.... tenzij je dat voor logging ofzo wilt gebruiken. In principe heb je genoeg aan het sockethandle... Vanuit het sockethandle kun je zaken als ip adres ook weer uitlezen.

Heel kort door de bocht is het sockethandle gewoon het id van een array aan informatie van een bepaalde client die geconnect is (d.m.v. een socket verbinding) met jouw server.

Dus wanneer je alle sockethandles hebt kun je dus informatie sturen naar alle clients. Zoals ik al eerder zei is het wel belangrijk dat je deze array van sockethandles goed bijwerkt wanneer clients connecten en disconnecten.

[ Voor 16% gewijzigd door Verwijderd op 24-12-2007 09:07 ]


  • Santo
  • Registratie: December 2007
  • Laatst online: 06-03 20:52
hmm ok, tnx voor de uitleg, maar weet je toevallig ook hoe dan iets naar die bepaalde sockethandle stuurd? welke commando je daarvoor nodig hebt :)?

Verwijderd

Ik heb indy nooit gebruikt met C++, alleen met Delphi... weet niet of het op dezelfde manier werkt. Overigens heeft indy vrij goede documentatie van z'n api's, dus je kan het vast en zeker opzoeken.

Ook is het veel te lang geleden, dus ik moet het een beetje gokken hoe het ook alweer was:

TServerSocket.Socket(1234).SendText('sladiebla')

Hierin is 1234 dan de sockethandle voor een bepaalde connectie.

  • smeerbartje
  • Registratie: September 2006
  • Laatst online: 07:13
Ik denk ook dat de sockethandle meer info bevat... dit is toch een active connectie ofniet? M.a.w. je krijgt dan geen gezeik met pakketjes die niet aankomen.

  • Santo
  • Registratie: December 2007
  • Laatst online: 06-03 20:52
jah, maar weet iemand dan hoe je dan naar verschillende sockethandle kan sturen?
en moet je die sockethandle opstaan in een array of in iets wat de indy server al in zich heeft?

Verwijderd

TIdTCPServer (of eigenlijk TIdCustomTCPServer) heeft een Contexts property, een lijst van alle client threads die actief zijn. Die clients hebben een connection, en die connection heeft een socket (plus handle).

Even uit m'n hoofd, want ik heb nu geen Indy bij de hand, maar da's ongeveer de richting waarin je 't moet zoeken.

  • Santo
  • Registratie: December 2007
  • Laatst online: 06-03 20:52
ik heb nu dit stukje code.. maar alleen de laatste regel snap ik nog niet....

Remote_IP, Remote_PORT, void * Buf, length Buf
dit moet in sendto worden gezet... is dit wat ik nodig heb, en hoe gebruik ik dat?


void TForm1::Aanmelden(String Bericht2)
{
IdTCPServer1->Bindings->Add();
int x;
for(x = 0; x != IdTCPServer1->Bindings->Count; x++)
{
ShowMessage("Aangemeld" + Bericht2);
IdTCPServer1->Bindings->Items[x]->Bind();
IdTCPServer1->Bindings->Items->SendTo();
}

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-11 18:33
Santo schreef op zaterdag 29 december 2007 @ 22:20:
Remote_IP, Remote_PORT, void * Buf, length Buf
dit moet in sendto worden gezet... is dit wat ik nodig heb, en hoe gebruik ik dat?
Weet je zeker dat sendto een TCP ding is?

[edit]
Ik heb even je replies doorgelezen maar ik krijg de indruk dat je (wat van) de basis mist. Het lijkt mij beter om daar te beginnen.

[ Voor 19% gewijzigd door farlane op 30-12-2007 01:59 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Santo
  • Registratie: December 2007
  • Laatst online: 06-03 20:52
mjah, maar is er meer basis dan dit?

en ik kan niet echt indy tutorials vinden voor Borland C++, alleen voor delphi... of weet iemand een goede site?

en die sent() maar daar moet ook een void pointer in.. en alleen de peerthread heeft een writeLn die k eigenlijk wil gebruiken... maar die peerthread heeft dus niet de sockethandle's ontvangen :P

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-11 18:33
Santo schreef op zondag 30 december 2007 @ 08:36:
mjah, maar is er meer basis dan dit?
Jah, Berkeley Sockets.

De socket API van Windows ( winsock ) is hiervan afgeleid, de documentatie van die API is erg goed, en kun je vinden op http://msdn2.microsoft.co.../ms741416%28VS.85%29.aspx ( Wel moet je dan filteren wat Win32 only is en wat bij de originele socket API ( http://en.wikipedia.org/wiki/Berkeley_sockets ) hoort. )

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 17:06

Creepy

Tactical Espionage Splatterer

Die Delphi tutorials gebruiken dezelfde classes dus die kan je prima gebruiken. Zoveel verschilt de syntax nu ook weer niet.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1