Страница 1 из 2
связь по ethernet
Добавлено:
24.09.2010 08:00:47
Yurakl
Добрый день!
У меня такой вопрос. У меня с одного компьютера программа, написанная в лазарусе на линуксе, передает данные на другой компьютер по эзернте. В случае отсутствия связи с компьютером данные должны сохраняться.
На данный момент наличие связи определяется с помощью команды send, которая возвращает количество переданных символов. Однако в некоторых моментах она почему-то не срабатывает. И при отсутствии сети данные все равно передаются. Как еще можно определить есть ли связь с другим компьютером по эзеренету?
Re: связь по ethernet
Добавлено:
24.09.2010 08:32:17
Timid
И почему же мой телепатический шлем никак не вернут из ремонта?
Вы бы Юракл, хоть код приложили.
Какой-такой Send, как передает данные?..
В первом приближении, варианта решения проблемы два:
1. Делать ping (запускать стороннюю утилиту) и смотреть вывод. Или написать свой аналог пинга на Indy.
2. Попросить целевой компьютер рассылать извещения о своей работе по UDP. Поищите примеры по "Чат по UDP".
Re: связь по ethernet
Добавлено:
24.09.2010 08:42:33
Yurakl
Я отправляю 0 байт в команде send, для проверки связи
- Код: Выделить всё
i:=send(s,buf[0],0,MSG_NOSIGNAL);
на целевом компьютере ничего не получится сделать, так как там специальный софт принимает данные просто от заданного айпишника.
программа работает автономно. она определяет есть ли связь по эзеренту, если есть то пересылает данные, если ее нет, то сохраняет их у себя в памяти,а при восстановлении выдает их в сеть.
Re: связь по ethernet
Добавлено:
24.09.2010 09:50:29
Timid
Все равно не вполне понятна задача. Вам ведь недостаточно знать о доступности "того" компьютера, нужно быть уверенным, что "там" запущено нужное приложение и оно "слушает" сокет.
Насчет кода, который Вы привели. buf - это строка или массив?
Если строка, то может нужно писать buf[1] ? И как Вы предполагаете передать 0 байт?
Может Вам стоит попробовать асинхронные сокеты. Там есть событие подтверждения установки соединения. Правда их реализация в Linux "хромает слегка".
Re: связь по ethernet
Добавлено:
24.09.2010 09:56:48
Yurakl
Когда на другом компьютере запускается тсп-клиент, то соответственно создается сокет, по которому передаются данные. buf-это массив. в предложенной строке передается 0 символов, соответственно если ничего не передается, то i=-1, а если передаст, то i=0. при помощи этого я и проверял наличие связи. В целом работает, но иногда при отключении провода, программа не видит отсутствия сети
Re: связь по ethernet
Добавлено:
24.09.2010 11:09:21
Vadim
YuraklУ Вас ошибка в алгоритме проверки.
Вам надо проверять не доступность ethernet, а доступность
того компьютера.
Ping это позволяет, так как получает ответ от конкретного того компьютера, а не от некоего мифического существа под названием "ethernet".
Re: связь по ethernet
Добавлено:
24.09.2010 11:19:45
Yurakl
Vadim
Подскажите, как тогда на лазарусе это проверить?
и на самом деле мне нужен не пинг с другим компьюетром,а именно есть ли связь.
Так как данные принимает специальное ПО(тсп-клиент), и если оно выключено, то связи нет и тогда данные не должны передаваться, а пинг будет
Re: связь по ethernet
Добавлено:
24.09.2010 12:12:35
Vadim
Yurakl писал(а):Так как данные принимает специальное ПО(тсп-клиент), и если оно выключено, то связи нет
Значить нужен список признаков, по которым можно точно определить, что это ПО запущено.
Итак, каковы эти признаки?
Re: связь по ethernet
Добавлено:
24.09.2010 12:26:07
Yurakl
если ПО запущено, то тсп-сервер включен, настроенный на заданный айпишник и порт, а следовательно создается сокет между ПО и программой
Re: связь по ethernet
Добавлено:
24.09.2010 13:35:05
ViTality
сначала пинг на доступность той машины
а потом проверяйте открыт ли порт который использует та спецпрога на той машине
Re: связь по ethernet
Добавлено:
24.09.2010 14:15:03
evd
А программа на другом компьютере тоже самописная?
Если да, то почему бы той программе не возвращать результат операции?
Т.е. псевдокод клиента выглядит так:
- Код: Выделить всё
Send(..); //отправляем данные
s:=ReadString(); //считываем результат операции
if SameText(s,'OK') then
//Данные успешно передались и программа-сервер данные обработала
else
//Данные не передались
В этом случае будет гарантия не только что данные передались, но и то что данные программа-сервер обработала (например сохранила в базе)
Re: связь по ethernet
Добавлено:
24.09.2010 14:27:02
Yurakl
программа самописная, но ней мной. Да и в принципе любой тсп-клиент должен работать с ней.
Мне необходимо в моей программе только что-то поправить, и никакой другой софт переписывать не надо.
Re: связь по ethernet
Добавлено:
24.09.2010 20:21:31
alexs
Медитируем над модулем ssockets
Смотри в папке исходников -
fpcsrc/packages/fcl-base/examples файлы
dsockcli.pp
dsocksvr.pp
если не страшно - о компилируем их
запускам сервер
потом клиента и удивляемся как всё просто.
Re: связь по ethernet
Добавлено:
27.09.2010 09:14:07
Yurakl
alexs
и что же эти файлы сделают???
а как-нибудь в программе в лазараусе можно что-то добавить или изменить???
Re: связь по ethernet
Добавлено:
27.09.2010 16:07:51
.wOvAN
А какой протокол используете? В TCP реализована поддержка гарантии доставки как таковая, если данные не доставлены возникают стандартные ошибки (с виде исключений или ещё как, зависит от реализации) все что остается это отлавливать эти ошибки.
Если же UDP то там надо реализовать свой механизм подтверждения доставки целостности данных.