Выберите () на сокете (проблема)
Недавно я сделал эту часть кода.
Это работает, но 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) {
блок.