Un socket sin bloqueo es aquel en el que llamamos al método fcntl() y le asociamos el indicador O_NONBLOCK. ¿Alguien puede decirme qué más se requiere para convertir un socket TCP_IP normal en un socket sin bloqueo?
¿Qué problemas pueden surgir si se hacen que los sockets sin bloqueo funcionen muy bien con los servidores de Windows?
El ejemplo de inicio para Linux puede verse así:
int flags;
s = socket(PF_INET, SOCK_STREAM, IPPROTO_IP) // ret 5
setsockopt(s, SOL_TCP, TCP_NODELAY, [1], 4)
setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, [1], 4)
setsockopt(s, SOL_SOCKET, SO_REUSEADDR, [1], 4)
flags = fcntl(s,F_GETFL,0);
assert(flags != -1);
fcntl(s, F_SETFL, flags | O_NONBLOCK);
connect(s, {sa_family=AF_INET, sin_port=htons(5001), sin_addr=inet_addr("192.168.0.68")}, 16)
Libro blanco básico del sol:
sol asych red
En Windows, utiliza sockets de E/S superpuestos para obtener redes sin bloqueo.
Mira aquí y en MSDN cómo escribir código con estructuras SUPERPUESTAS
En Linux use epoll().
En el zócalo solaris().
Tenga cuidado de leer o escribir en un socket cuando no esté listo. (seleccionar salida) Porque puede recibir un error EAGAIN.
La gran biblioteca multiplataforma (pero C++ y el nuevo candidato estándar de c++) es boost::asio.
Utiliza métodos asincrónicos del sistema nativo.
impulso::asio
.
Suena demasiado a tarea. Segunda pregunta, no puedo encontrar un proyecto factible que requiera dos piezas muy dispares de programación elemental del sistema operativo.
– Stefan Mai
06 oct.
En realidad, está destinado a ser utilizado para no esperar el tráfico entrante en un entorno en línea.
– Sachin Chourasiya
06 oct.