2009-12-07 18 views
0

Récemment, j'ai fait this partie du code.select() sur socket (problème)

Cela fonctionne, mais select() fonctionne mal.
Lorsqu'il a reçu la dernière réponse du serveur, il commence à répéter la dernière chaîne de réponse avec des caractères étranges au début de la chaîne de réponse. Regardez donc ceci:

:[email protected] PRIVMSG testuser1 :VERSION 
�C���C��[email protected] PRIVMSG testuser1 :VERSION 
�C���C��[email protected] PRIVMSG testuser1 :VERSION 
�C���C��[email protected] PRIVMSG testuser1 :VERSION 
�C���C��[email protected] PRIVMSG testuser1 :VERSION 

La première chaîne est la dernière réponse du serveur. Donc, les prochaines chaînes sont juste des déchets. J'ai essayé de chercher des informations dans certains moteurs de recherche, mais pas de chance.

Répondre

2

Ce n'est pas select qui a le problème, c'est la logique dans votre code (sans surprise).

Si select retours parce que stdin est lisible, alors vous regardez toujours à c[0] (depuis la dernière lecture du serveur) - et même si vous ne l'avez pas lu à partir du serveur cette fois-ci, il est encore \n, parce que vous ne le réinitialiser.

Déplacer ce morceau de code:

if (c[0] == '\n' || c[0] == '\0') {           
     buf[--buflen] = '\0';             
     handleMessage(buf, buflen); /* Just print message */ 
     buf_do_clean = 1;              
    }                   

à l'intérieur du bloc else if (rc == 1) {.

+0

Merci, c'est ce que je cherchais. Maintenant, j'ai tous les problèmes. – mroztn