Autor Tema: fsock y fsock_setblock con UDP (bug?)  (Leído 386 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Conectado darío

  • Sr. Member
  • ****
  • Mensajes: 449
  • Karma: 48
  • Sexo: Masculino
    • Ver Perfil
fsock y fsock_setblock con UDP (bug?)
« en: Junio 20, 2016, 02: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:

Código: [Seleccionar]
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:

Código: [Seleccionar]
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
« última modificación: Junio 20, 2016, 03:29:08 am por 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

Desconectado josebita

  • Administrator
  • Hero Member
  • *****
  • Mensajes: 4038
  • Karma: 257
  • Sexo: Masculino
    • Ver Perfil
    • BennuGD Mobile Worklog
Re:fsock y fsock_setblock con UDP (bug?)
« Respuesta #1 en: Junio 20, 2016, 05:41:12 am »
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.