[C++]Property van Socket wijzigen

Pagina: 1
Acties:

  • CRiMiNaL
  • Registratie: Mei 2002
  • Laatst online: 10-01-2024
Ik ben 2 simpele C++ console programma'tjes aan het maken die met elkaar communiceren, een server en een client.

Beide werken ze prima, alleen het server programma'tje hangt terwijl hij wacht op een binnenkomende connectie. Ik weet dat dit komt doordat ik een blocking socket gebruik.

Ter verduidelijking eerst wat relevante code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void Connection::run(void)
{
      SOCKET ClSocket = INVALID_SOCKET;
      SOCKET SvrSocket = INVALID_SOCKET;
      conp = new con();
      // verkrijg een socket om te luisteren naar inkomende connecties
      SvrSocket = conp->getsocket(2);
      // Deze functie hangt tot er een inkomende connectie is.
      ClSocket = conp->listens(SvrSocket);
      // Luisteren naar wat de client te zeggen heeft
      conp->recievemsg(ClSocket);
      // Stuur iets terug
      conp->sendmsg(ClSocket);
      // Sluit de socket
      conp->closeclientsock(ClSocket);
}


Nu las ik dus op MSDN dat ik de property "blocking" op false kan zetten en dat dan de socket method "accept" niet meer hangt totdat er een connectie is.

Mijn probleem: Hoe wijzig ik de property van mijn socket (SvrSocket)

Zelf probeerde ik het eerst zo :
code:
1
2
SvrSocket.blocking = false;
SvrSocket->blocking = false;

Beide werkten niet met de foutmelding dat "SvrSocket" geen class of structure is.

Ik ben hier nou al eventjes op aan het puzzelen, vermoedelijk maak ik ergens een beginner denkfout.
Alvast bedankt voor de hulp.

... MMORPG Addict.


  • IntToStr
  • Registratie: December 2003
  • Laatst online: 10:18
Niet gehinderd door enige kennis mbt het onderwerp, zou ik zeggen dat conp hier je object is en en SvrSocket meer iets als een resource.

Ik zou eens zoeken naar de mogelijkheden mbt con.

  • CRiMiNaL
  • Registratie: Mei 2002
  • Laatst online: 10-01-2024
IntToStr schreef op vrijdag 23 maart 2007 @ 13:45:
Niet gehinderd door enige kennis mbt het onderwerp, zou ik zeggen dat conp hier je object is en en SvrSocket meer iets als een resource.

Ik zou eens zoeken naar de mogelijkheden mbt con.
conp is een nieuwe instance van de "con" class, die class bevat alle functies (listen, send, recieve, accept) die ik gebruik.

... MMORPG Addict.


  • DroogKloot
  • Registratie: Februari 2001
  • Niet online

DroogKloot

depenisvanjezus

Als je in plain C++ bezig bent, waarom zoek je dan in de MSDN onder de .NET Socket class? :? Kijk eens hier en hier, daar kun je waarschijnlijk meer mee.

  • Marcj
  • Registratie: November 2000
  • Laatst online: 10:21
De MSDN waar je naar verwijst is van het .NET framework. Bij deze kan dat inderdaad. Maar zo te zien gebruik je een SOCKET handle, welke niet een class oid is, maar gewoon een pointer naar de socket en met enkele andere functies kun je dat dingen met die socket doen.

Zie ook bijvoorbeeld: Sockets tutorial

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Er zijn heel veel manieren om sockets te gebruiken. Dat Msdn artikel gaat over een andere manier dan wat jij gebruikt.

Wat jij gebruikt weet ik niet, maar het lijkt een beetje op de gewone winsock api. Ik zie alleen nergens de WSAStartup(..) staan.

Dat een server blocking is, is normaal. Laatst was hier op GOT iemand die (volgens mij in Java) het met een timeout nonblocking had gemaakt. Je zal waarschijnlijk dus ook zoiets moeten doen.

  • CRiMiNaL
  • Registratie: Mei 2002
  • Laatst online: 10-01-2024
DroogKloot schreef op vrijdag 23 maart 2007 @ 13:52:
Als je in plain C++ bezig bent, waarom zoek je dan in de MSDN onder de .NET Socket class? :? Kijk eens hier en hier, daar kun je waarschijnlijk meer mee.
Deze manier lost mijn probleem inderdaad op, ik had niet bewust gezocht in de .NET socket class.

Ik was gewoon op de functie "accept" gaan staan in VC 2005 en druk F1 voor help, niet opgemerkt dat ik in de .NET sectie zat :/

Probleem opgelost.

... MMORPG Addict.


  • Marcj
  • Registratie: November 2000
  • Laatst online: 10:21
Pas je wel op dat je aan de serverkant geen 'busy loop' maakt die maar constant loop te controleren of er al iemand geconnect is? Dit is namelijk niet zo heel goed voor je performance ;) Het is in zo'n geval inderdaad beter om met een timeout te gaan werken (zie dit topic). Alleen weet ik zo niet of dit ook zo makkelijk in C++ kan.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Timeouts zijn (met alle respect) prutsoplossingen. Een redelijke oplossing is om een aparte thread te maken, en die dan te laten blocken. De originele thread kan dan gewoon doorgaan. De worker thread gebruikt geen CPU zolang deze blockt.

De schaalbare (high-performance) oplossing is overlapped I/O. In dat geval handel je per thread een heleboel sockets af. Als er op één van je sockets data aankomt, dan wordt het event van die socket gesignalled, en met WaitForMultipleObjects kun je dat event en dus socket efficient vinden. Is er geen data, dan gebruikt WaitForMultipleObjects geen CPU.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • JochemK
  • Registratie: Maart 2003
  • Laatst online: 25-11 10:41
Goeie site met plain C code voorbeelden (die nog werken ook :P) met winsocks:

http://cs.ecs.baylor.edu/...cal/CSockets/winsock.html

't is niet altijd ff duidelijk welke files je bij elkaar moet pakken en compilen, maar als je d'r niet uit komt, dan heb je het niet nodig ook ;)

Ik zou ook voor de oplossing met een blocking thread gaan, sterker nog, dat doe ik nu in m'n schoolprojectje ;)
Pagina: 1