Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Windows non-blocking socket

[es] :: C/C++ programiranje :: Windows non-blocking socket

[ Pregleda: 1981 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

peromalosutra
Ivan Rajkovic
Software engineer
Luxoft
Berlin

Član broj: 54774
Poruke: 878
*.dialup.blic.net.



+148 Profil

icon Windows non-blocking socket22.09.2006. u 21:34 - pre 214 meseci
Nisam imao mnogo iskustava sa socketima pa sam naisao na mali problem:
Imam stream socket koji ne bi trebao da blokira, nego bi samo s vremena na vrijeme sa recv() funkciom provjerio "ima li sta novo" na socketu. E sad kako da to uradim. Koliko vidim to bi bila funkcija:
Code:

fcntl(sockfd, F_SETFL, O_NONBLOCK);

ali mi ista ne radi na windowsu.

I uopšte molim za savjet:
Da li da koristim stream ili datagram sockete, pošto se radi o dodavanju multiplayera na igru koju sam skoro napravio...

Hvala!

 
Odgovor na temu

Buffy
Stanko Culaja
Sipovo, BiH

Član broj: 45310
Poruke: 312
..96-32.staticIP.rima-tde.net.



Profil

icon Re: Windows non-blocking socket28.09.2006. u 11:52 - pre 214 meseci
Imas vise nacina da rijesis taj problem. Mozes pomocu funkcije select i pomocu thredova.
Meni je elegantnije raditi sa thredovima.
Jednostavno, napravi jedan thread pomocu CreateThread funkcije ( za detalje pogledaj msdn).
CreateThread funkciji prosljedis kao argument pointer na neku call back funkciju koju ti sam definises i iz nje pozivas funkciju recv koja blokira samo taj thread koji si ti napravio, a glavna nit programa nastavlja da radi nezavisno od novostvorenog threada.
Pozdrav!
 
Odgovor na temu

nikoladsp
nikola radovanovic
trenutno-developer
novi sad

Član broj: 5455
Poruke: 193
*.ns.ac.yu.



Profil

icon Re: Windows non-blocking socket28.09.2006. u 12:06 - pre 214 meseci
nesto slicno ovome:
Code:
#ifdef _WIN32
    
    DWORD NonBlock = (!bBlocking) ? 1 : 0;

    if (ioctlsocket(m_nSockDesc, FIONBIO, &NonBlock) != 0) {

        perror("non-block");
        exit(1);
    }

#else

    long nArg = fcntl(m_nSockDesc, F_GETFL, NULL);
    
    if (nArg >= 0) { 
    
        if (!bBlocking) {

            nArg |= O_NONBLOCK; 

        } else {

            nArg ^= O_NONBLOCK; 
        }
    
        nArg = fcntl(m_nSockDesc, F_SETFL, nArg);

        if (nArg < 0) {

            perror("fcntl");
            exit(1);
        }
    }

#endif

kao sto rece Buffy u ovom slucaju moras koristiti select().ms ima i iocp tehniku za postizanje velikog broja konekcija.

ja sam panker sa diplomom kod moje mame...
 
Odgovor na temu

[es] :: C/C++ programiranje :: Windows non-blocking socket

[ Pregleda: 1981 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.