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
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.