[ peromalosutra @ 22.09.2006. 21:34 ] @
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!
[ Buffy @ 28.09.2006. 11:52 ] @
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!
[ nikoladsp @ 28.09.2006. 12:06 ] @
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.