Bennu Game Development

Foros en Español => General => Topic started by: darío on June 20, 2016, 10:25:39 AM

Title: fsock y fsock_setblock con UDP (bug?)
Post by: darío on June 20, 2016, 10:25:39 AM
Hola,

Estoy teniendo problemillas utilizando mod_fsock. Estoy programando en PixTudio, pero imagino que sería igual en BennuGD ya que la mod_fsock creo no se tocó.

Básicamente quiero poder usar udpsock_recv de un modo no bloqueante, y para ello quiero usar la función fsock_setblock.

Pues bien, he probado a usar fsock_setblock ( socket, 1 ) y fsock_setblock ( socket, 0 ) sin éxito alguno (udpsock_recv SIEMPRE bloquea).

Ejemplo:


Private
    int socket;
    string from_ip;
    byte bytes[256];
    int port;
    int received_bytes;
End
Begin
    fsock_init ( 0 );
    socket = udpsock_open ();
    say ( "Result setblock: " + fsock_setblock ( socket, 1 ) );
    fsock_bind ( socket, 11000 );
     
    timer [0] = 0;
   
    Loop
        If ( timer[ 0 ] > 300 )
           
            received_bytes = udpsock_recv ( socket,
                &bytes,
                3,
                &from_ip,
                &port );
               
            say ( "Received: " + received_bytes );
            say(bytes[0]);
            say(bytes[1]);
            say(bytes[2]);
           
            If ( received_bytes > 0 )
                // multiplayer_process_receive_frame ( &bytes );
            End
           
            timer[ 0 ] = 0;
        End
       
        Frame;
    End

OnExit:
    fsock_close(socket);
    fsock_quit ();


Me puse a mirar el código de libsocket y vi que si lo sustituyo por lo siguiente:


int libsocket_setblock(int fd, u_long ulVal) {
#ifdef WIN32
    return (ioctlsocket(fd, FIONBIO, &ulVal));
#else
    //return (fcntl(fd, O_NONBLOCK, ulVal));
   
    int flags = fcntl(fd, F_GETFL, 0);
   
    if (flags < 0)
        return -1;
   
    flags = (ulVal != 0) ? (flags &~O_NONBLOCK) : (flags|O_NONBLOCK);

    return fcntl(fd, F_SETFL, flags);
#endif
}


Entonces sí que obtengo el comportamiento deseado. Ahora bien, no se si soy yo que no he entendido cómo usar libsocket_setblock o si es un bug.

Lógicamente estoy usando Linux, no tengo ni idea de lo que ocurre en Windows.

Agradecería de vuestro sabio conocimiento :)

EDIT: Edité el código C que siempre metia el flag O_NONBLOCK.
EDIT2: ulVal != 0 en lugar de ulVal == 0.

Un saludo,
Darío
Title: Re:fsock y fsock_setblock con UDP (bug?)
Post by: josebita on June 20, 2016, 01:41:12 PM
Tengo que mirarlo, pero en principio el código de fsock es el mismo que el de la librería para BennuGD, así que esto debería ser aplicable.