
Envoyé par
wiztricks
select accepte le paramètre timeout qui s'il est non null mais avec timeval null doit retourner sans attendre
Maintenant à quoi cela sert-il d'ajouter des seaux pour amortir le débordement de la pile IP: les affichages auront un retard dont la borne supérieure risque d'être difficile à définir.
La mémoire du système n'étant pas infinie, le programme risque de planter plus ou moins rapidement voire consommer suffisament d'espace swap pour ralentir l'ensemble des activités du système.
-W
J'essai d'utiliser la fonction select en non bloquant, voici mon code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| void IONet::write_to_socket()
{
int ret = 0;
fd_set writefs;
timeval l_time;
FD_ZERO(&writefs);
FD_SET(_socket, &writefs);
l-time.tv_sec = 0;
l-time.tv_usec = 0;
SOCKADDR * addr = _cliAddr.asSockAddr();
((sockaddr_in*)addr)->sin_addr.s_addr = INADDR_BROADCAST;
if(select(_socket+1,NULL,&writefs,NULL,&l_time)==1)
ret = ::sendto(_socket,_ostring.base,_ostring.length,
0, addr, sizeof(SOCKADDR));
//traitement de ret
...
} |
Avec ce code, malgré que le buffer d'émission soit plein, le message est quand même envoyé. Voyez-vous où j'aurai pu commettre une erreur ?
Par contre si j'utilise
select(_socket+1,NULL,&writefs,NULL,NULL)
Aucune erreur n'est provoquée, mais j'ai peur que bloquer le programme puisse produire des problèmes à d'autres endroits...
Partager