выберите () на сокете (проблема) - PullRequest
0 голосов
/ 07 декабря 2009

Недавно я сделал эту часть кода.

Работает, но select () работает плохо.
Получив последний ответ от сервера, он начинает повторять последнюю строку ответа со странными символами в начале строки ответа. Итак, посмотрите на это:

:nacbot!monitor@nac.bot PRIVMSG testuser1 :VERSION
�C���C��monitor@nac.bot PRIVMSG testuser1 :VERSION
�C���C��monitor@nac.bot PRIVMSG testuser1 :VERSION
�C���C��monitor@nac.bot PRIVMSG testuser1 :VERSION
�C���C��monitor@nac.bot PRIVMSG testuser1 :VERSION

Первая строка - это последний ответ от сервера. Так что следующие строки просто мусор. Я пытался искать информацию в некоторых поисковых системах, но безуспешно.

1 Ответ

2 голосов
/ 07 декабря 2009

Проблема не в select, а в логике вашего кода (неудивительно).

Если select возвращается, потому что stdin доступен для чтения, вы все равно смотрите на c[0] (из последнего чтения с сервера) - и даже если вы не читали с сервера на этот раз, это все равно \n, потому что Вы никогда не сбрасываете его.

Переместить этот бит кода:

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

внутри блока else if (rc == 1) {.

...