1 / 1 / 0
Регистрация: 13.02.2012
Сообщений: 120
|
||||||
1 | ||||||
Код C, работа с сокетами (forward data)24.03.2017, 21:37. Показов 877. Ответов 5
Привет всем. Есть вопрос, который мне крайне непонятен... Пишу систему балансировки нагрузки и вот, сервер, который должен перенаправлять данные от клиента к целевому серверу и обратно первые несколько раз делает это корректно, но спустя некоторое время, когда я из браузера выполняю запрос на свой сервер, то получаю ошибку (events[i].events & EPOLLERR). Помогите, пожалуйста разобраться. Код ниже
Ошибка как-то связана с методом static int forwardData (int fd). После небольшого ожидания я вижу в терминале printf("------------------buf-------------------------\n"); printf("------------------end buf---------------------\n"); эти 2 строки, затем ошибка EPOLLERR и браузер не может отобразить страницу. После остановки загрузки страницы и возобновления ее загрузки, страница становится доступна... В куске кода, где происходит проверка на ошибки EPOLLERR, EPOLLHUP и EPOLLIN и получил epoll error error = Broken pipe. Помогите, пожалуйста, решить проблему.
0
|
24.03.2017, 21:37 | |
Ответы с готовыми решениями:
5
Перевести код с C++ (работа с сокетами) Работа с сокетами: получить исходный код странички в интернете Работа с сокетами Работа с сокетами |
73 / 73 / 11
Регистрация: 20.11.2009
Сообщений: 238
|
||||||
25.03.2017, 12:10 | 2 | |||||
Строка 299: На момент вызова error_read объявлен, но не инициализирован.
Строка 301: clientSocket объявлен, но нигде не инициализирован. Читает неизвестно откуда, невесть что. Строка 348: forwardSockets объявлен как массив размерностью EPOLL_QUEUE_LEN, поэтому
Строка 349: Аналогично, только infd в позицию forwardSD. Строка 378 - 382: Неизвестно что сравниваем с 0 и, затем, пишем в forwardData, как следствие --> --> Строка 391: Посылаем неизвестно куда. А Оригинал нормально работает?
1
|
1 / 1 / 0
Регистрация: 13.02.2012
Сообщений: 120
|
|
25.03.2017, 13:02 [ТС] | 3 |
Т.к. весь код не поместился в сообщение (ограничение форума), то код на получение ip адреса наименее загруженного сервера приведен не полностью (321-334 строки), строки 378-382 - здесь в forwardData я отправляю дескриптор подключившегося клиента и, если forwardData вернет не true, закрываю дескриптор (events[i].data.fd). Код по ссылке https://banu.com/blog/2/how-to... mple-in-c/ рабочий, в переделанном варианте он успешно используется у меня в качестве сервера, который получает сообщения с информацией о загруженности серверов и, при запросе от сервера, код которого в этой теме размещен (запрос как раз не поместился в тему), тот сервер высылает ip адрес (содержится в массиве remote_host) сервера, к которому коннектится для получения информации клиентом. Вопрос открыт. Почему же я получаю ошибку error = Broken pipe в строке 251?
Добавлено через 22 минуты Насколько я понимаю, кто-то рвет соединение после небольшого простоя. Или клиент (браузер) или сервер назначения (apache 2). Но как восстановить соединение безболезненно - пока не пойму. Еще я заметил такую особенность - создается дескриптор клиента, например 5, работает все хорошо. Потом проходит секунд 10-30, я вижу printf("------------------buf-------------------------\n"); printf("------------------end buf---------------------\n"); В выводе в терминал, в браузере страница грузится "бесконечно". Я перезагружается страницу, создается новый дескриптор, например 7, ситуация в браузере аналогична, еще раз перезагружаю, дескриптор снова 5 и все отлично быстро загружается...
0
|
73 / 73 / 11
Регистрация: 20.11.2009
Сообщений: 238
|
|
25.03.2017, 19:14 | 4 |
broken_pipe = EPIPE (взято из файла error_constants.h).
Из всех используемых Вами функций эту ошибку возвращает только send (или я плохо искал). Причем, в Linux может вернуть EPIPE еще и вместо ENOTCONN. Еще раз проверьте, что пишет в строках 378 - 382.
1
|
1 / 1 / 0
Регистрация: 13.02.2012
Сообщений: 120
|
|
26.03.2017, 15:04 [ТС] | 5 |
Сам принцип forwardData (там как раз и есть send сначала со стороны клиента в адрес сервера, а потом наоборот) был взят отсюда http://stackoverflow.com/quest... d-all-data и изменен под мои нужды. Может я что-то упустил и глаз уже замылен... Посмотрите, пожалуйста, свежим взглядом, где я мог допустить ошибку? Там человек пишет, что изменил свой метод forwardData так, что он читает все данные, а только потом отправляет. Я же в своем коде просто использую большой буфер
0
|
73 / 73 / 11
Регистрация: 20.11.2009
Сообщений: 238
|
||||||||||||||||
27.03.2017, 18:55 | 6 | |||||||||||||||
Попробуйте так:
И запись
0
|
27.03.2017, 18:55 | |
27.03.2017, 18:55 | |
Помогаю со студенческими работами здесь
6
Работа с сокетами Работа с Сокетами Работа с сокетами Работа с сокетами Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |