[C++] In de problemen met statics

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • xehbit
  • Registratie: Februari 2009
  • Laatst online: 26-08 22:19
OEPS ! Topic in verkeerd fora deel geplaatst!! (graag verplaatsen, iemand.. O-) )

Hey Tweakers,

Ik loop met een klein probleempje, ik ben bezig met een simpele TCP client (again...) aan het schrijven. Maar daar wil iets totaal niet in lukken en lop vast met 'static'.

Ik heb een connect functie die een thread maakt voor ConnectCallback. Maar ConnectCallback moet dan wel een static functie zijn, anders kan ik de _startthread niet uitvoeren. Maar omdat ConnecCallback static is kan ik ook niet connecten met de socket _sock(networksession.h). dan moet ik de _sock ook static maken. En dat is iets wat ik dus niet wil. Bestaat hier een enige oplossing voor ?

Het betreft de volgende code:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void TcpClient::Connect(char* host, unsigned short port)
{
    NetworkData::sckAddr addr;
    addr.host = host;
    addr.port = port;
    _beginthread(TcpClient::ConnectCallback, NULL, (void*)&addr);
}

void TcpClient::ConnectCallback(void* params)
{
    NetworkData::sckAddr *addr = (NetworkData::sckAddr*)params;
    sockaddr_in sckAddr;
    sckAddr.sin_family = AF_INET;
    sckAddr.sin_port = htons(addr->port);
    sckAddr.sin_addr.S_un.S_addr = inet_addr(addr->host);
    if(connect(_sock, (sckAddr*)(&sckAddr), sizeof(sckAddr))!=0)
    {
        cout << "Could not connect with: " << addr->host << " on port: " << addr->port << endl;
    }
    else
    {
        cout << "Connected to: " << addr->host << " on port: " << addr->port << endl;
    }
    _endthread();
}


De fout code/debug code:
code:
1
error: invalid use of member 'NetworkSession::TcpClient::_sock' in static member function


Hier nog de networksession.cpp en networksession.h
networksession.h
networksession.cpp

[ Voor 7% gewijzigd door xehbit op 09-10-2011 12:39 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je moet je 'this' gewoon meegeven zodat je daar in ConnectCallback() gebruik van kunt maken. Overigens klopt je huidige code ook niet. Je geeft nu het adres van 'addr' mee aan de nieuwe thread, maar omdat 'addr' op de stack staat bestaat hij niet meer nadat Connect() is geëindigd. Er is geen garantie dat de code in de nieuwe thread die gebruik maakt van die struct uitgevoerd wordt voordat Connect() beëindigd wordt.

Je kunt dus ofwel een struct op de heap aanmaken waar zowel je thispointer als je addr struct in staan en die meegeven aan de thread, ofwel ruimte in je klasse zelf reserveren voor 'addr' zodat je alleen nog de 'this' mee hoeft te geven.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
WEB >> PRG

[ Voor 82% gewijzigd door RobIII op 10-10-2011 00:26 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Boost::thread is stukje handiger: de ctor accepteert tot 9 argumenten, en kopieert ze. Het is een template, je hoeft dus niet met void* te prutsen.

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