Страниц: [1]
  Печать  
Автор Тема: Чудеса TCPIP клиент-сервер  (Прочитано 4368 раз)
Аноним
Гость
« : Октября 27, 2003, 02:04:13 pm »

Привет ALL!
Сделал клиент-сервер по TCPIP c использованием inetd.

Клиент может посылать один из двух видов запросов.
На один из запросов сервер овечает нормально.

На другом запросе я голову сломал...
1. клиент посылает запрос фунцией write
2. write возвращает -1 , то есть я раньше понимал что посылка запроса пакета не удалась,
strerror(errno) возвращал "Broken pipe"

у другого запроса таких проблем в принципе не было...
соответственно сначала грешил на клиента -- где то ошибка...

но не давно легли подозрения на СЕРВЕР -- в коде СЕРВЕРА(!) закоментировал функции работы с памятью при ОБРАБОТКЕ (обработка же после read()!) "плохого" запроса...

проблемы ушли -- у клиента функция write() стала возвращать положенные размер посланного пакета, и соответственно принимать ответные пакет от сервака.
Конечно сервак падал из-за плохой работы с памятью...

Мне не понятно почему при посылке запроса КЛИЕНТОМ к СЕРВЕРУ, у сервера read() срабатывает НОРМАЛЬНО, НО write КЛИЕНТА возвращает -1.
Записан
olej
QOR.Team
****
Offline Offline

Сообщений: 42



Просмотр профиля
« Ответ #1 : Октября 27, 2003, 02:16:50 pm »

Могу только предположить:
- если проблемы могли быть при выделении памяти...
- то сервер с этого момента сразу же падал в core...
- не успевая даже нормально завершить отправку через сокет ACK или что-то такое...

А вообще - вот так, на пальцах, спрашивать - дело дурное... Нужно показывать код... да не весь - а не полениться отобрать только те строки, которые имеют отношение к делу... да ещё inetd.conf - что там? wait, nowait прописано - поведение будет разное... И т.д.

Я понимаю, что сейчас в форум ничего типа кода отсылать не получается ... "реконструкция" (её мать!)... ну, как-то пытаться нужно.

P.S. А ещё напомню - лучше регистрироваться, чтоб хоть знать - с кем разговариваешь! Хотя, с другой стороны - тоже "реконструкция" ... я сам через раз "Аноним" (а не я ли это сам спрашивал ?).
Записан
bessonov
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #2 : Октября 27, 2003, 03:18:18 pm »

в  inetd.conf написано nowait я делел по статье "много серверов хороших и разных..."

я согласен, с твоим предположением,
что процесс отработки read() сервера не успевает ответить write() клиента, о тои что он всё круто получил...

паузу что ли ставить (?), что бы драйвера и TCPIP сервисы были расторопнее чем приложения пользователя грохали систему?...
Записан
vlad
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #3 : Ноября 07, 2003, 05:56:41 am »

Скорее всего при падении сервера сокет в npm-tcpip помечался как закрытый с ошибкой и соответственно для всех входящих сегментов на этот адрес и порт отсылал RST. А EPIPE скорее всего и означает разорванный TCP канал.

Но тут желательно смотреть сетевую картину снифером. Да и вообще сниффер надо использовать всегда при разработке сетевых приложений (что и Olej и многие другие сто раз советовали). Тогда многие процессы становятся намного более понятными.
Записан
Страниц: [1]
  Печать  
 
Перейти в: