fsock y fsock_setblock con UDP (bug?)

Started by darío, June 20, 2016, 10:25:39 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

darío

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
My sites:
Smart Fpg Editor - Painless FPG Edition for Bennu and PixTudio
fenixlib - .NET support for manipulating PixTudio, Bennu and Div graphic formats

josebita

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.