2009-10-06 6 views
1

Un socket non bloquant est celui dans lequel nous appelons la méthode fcntl() et associe l'indicateur O_NONBLOCK à celui-ci. Quelqu'un peut-il me dire quoi d'autre est nécessaire pour convertir un socket TCP_IP normal dans un socket non bloquant?Socket non bloquant

Quels problèmes peuvent survenir si les sockets non bloquantes fonctionnent correctement avec les serveurs Windows?

+1

Cela ressemble trop aux devoirs. La deuxième question ne peut pas aboutir à un projet réalisable qui nécessiterait deux éléments très disparates de programmation élémentaire d'OS. –

+0

En fait, il est destiné à être utilisé pour ne pas attendre le trafic entrant dans l'environnement en ligne. –

Répondre

8

Exemple d'initialisation pour Linux peut ressembler à ceci:

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) 

Livre blanc de base du soleil:

sun asych net

Sur les fenêtres Vous utilisez prises chevauché IO ​​pour obtenir la mise en réseau non bloquant.

Look here and in MSDN how to write code with OVERLAPPED structures

sur l'utilisation de Linux epoll().

Sur la prise solaris().

Sachez lire ou écrire sur une socket lorsqu'elle n'est pas prête. (select-output) Parce que vous pouvez recevoir une erreur EAGAIN.

Grande bibliothèque de plate-forme croisée (mais C++ et nouveau candidat standard C++) est boost :: asio.

Il utilise des méthodes asynchrones du système natif.

boost::asio

+1

Y a-t-il un moyen d'y parvenir en C. Ce qui doit être pris en charge est utilisé sur les serveurs Windows ou Linux? –

Questions connexes