Хауди. Я нахожусь в сетевом классе, и мы создаем наш собственный "сетевой API", используя функции сокетов, которые мы изучили в классе.
Для задания профессор предоставил уже готовые программы чата и сервера, и мы должны были заполнить пустой файл .c, который имел связанный заголовочный файл, описывающий вызовы функций в нашем маленьком «сетевом API», что чат и сервер используемые программы.
Я близок к завершению, но столкнулся с проблемой. Я собирался пойти и поиграть с моим кодом, но все остальные части моего «сетевого API» работают, поэтому я не хотел с ним связываться, когда я так близок к завершению и имею небольшое изменение, потому что другие части не работать. Кроме того, я не уверен на 100%, что я действительно знаю, в чем заключается моя ошибка.
Моя проблема в моей функции recv_line, которая должна имитировать recv ().
Моя функция recv_line получает дескриптор файла от клиента для соединения, которое было установлено с сервером. Затем я связываю поток с дескриптором файла с помощью fdopen. Бит кода выглядит так:
// Associate a stream with the sock_fd
if (NULL == (fdstream = fdopen(sock_fd, "r"))) {
return -1;
}
Теперь я считаю, что это моя ошибка, но я не уверен на 100%, как я сказал. Во-первых, когда я впервые использую функцию recv_line, она прекрасно работает. На самом деле это делает строку recv_line, как и ожидалось. Но проблема возникает во второй раз.
Я прошел через свою функцию с GDB, и приведенный выше фрагмент кода работает без проблем. Затем я продолжаю снимать символ из моего потока (используя fgetc) и проверяю, равен ли он символу EOF. Если это я вернусь, иначе я обработаю это. Во второй раз, когда я вызываю recv_line, он возвращает, потому что каждый раз читает символ EOF.
Я предполагаю, что это происходит, потому что данные, отправленные клиенту, находятся в исходном потоке (тот, который был создан первый раз), и во второй раз, когда я вызываю fdopen, во втором созданном мною потоке нет данных ? Я не совсем уверен, как работает fdopen, когда я вызываю его во второй раз?
С другой стороны, я читаю мои данные таким образом, поскольку мы должны продолжать читать данные до тех пор, пока мы не прочитаем EOF или последовательность символов \ r \ n. Я использую getc и ungetc с потоком, чтобы обеспечить механизм просмотра вперед, который будет проверять EOF или последовательность \ r \ n.
Итак, при всем этом, кто-нибудь знает, что именно происходит с моим большим кодом и программой? Я гуглил метод, чтобы проверить, есть ли у FD связанный с ним поток, и он не смог ничего найти / увидеть. Я провел некоторое исследование, чтобы увидеть, была ли какая-то функция времени fstat, которая позволяла бы мне видеть связанные пары и ничего не придумала. Могу ли я просто скопировать FD, который передается в функцию recv_line, а затем fdopen на дублированном FD и избежать всех этих проблем?
Спасибо за помощь. Мне жаль, если я не был достаточно ясен. Я сделаю все возможное, чтобы уточнить что-либо, если вы попросите меня сделать это. И извините, мой вопрос был таким длинным. = * (* * Тысяча двадцать-две
Еще раз спасибо. Я очень ценю вашу помощь.