Выберите () на сокете (проблема)

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

Это работает, но 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 ответ

Решение

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

Если select возвращает, потому что стандартный ввод для чтения, то вы все еще смотрите на 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) { блок.

Другие вопросы по тегам