связь по ethernet
Модератор: Модераторы
связь по ethernet
Добрый день!
У меня такой вопрос. У меня с одного компьютера программа, написанная в лазарусе на линуксе, передает данные на другой компьютер по эзернте. В случае отсутствия связи с компьютером данные должны сохраняться.
На данный момент наличие связи определяется с помощью команды send, которая возвращает количество переданных символов. Однако в некоторых моментах она почему-то не срабатывает. И при отсутствии сети данные все равно передаются. Как еще можно определить есть ли связь с другим компьютером по эзеренету?
У меня такой вопрос. У меня с одного компьютера программа, написанная в лазарусе на линуксе, передает данные на другой компьютер по эзернте. В случае отсутствия связи с компьютером данные должны сохраняться.
На данный момент наличие связи определяется с помощью команды send, которая возвращает количество переданных символов. Однако в некоторых моментах она почему-то не срабатывает. И при отсутствии сети данные все равно передаются. Как еще можно определить есть ли связь с другим компьютером по эзеренету?
Re: связь по ethernet
И почему же мой телепатический шлем никак не вернут из ремонта? 
Вы бы Юракл, хоть код приложили.
Какой-такой Send, как передает данные?..
В первом приближении, варианта решения проблемы два:
1. Делать ping (запускать стороннюю утилиту) и смотреть вывод. Или написать свой аналог пинга на Indy.
2. Попросить целевой компьютер рассылать извещения о своей работе по UDP. Поищите примеры по "Чат по UDP".
Вы бы Юракл, хоть код приложили.
Какой-такой Send, как передает данные?..
В первом приближении, варианта решения проблемы два:
1. Делать ping (запускать стороннюю утилиту) и смотреть вывод. Или написать свой аналог пинга на Indy.
2. Попросить целевой компьютер рассылать извещения о своей работе по UDP. Поищите примеры по "Чат по UDP".
Re: связь по ethernet
Я отправляю 0 байт в команде send, для проверки связи
на целевом компьютере ничего не получится сделать, так как там специальный софт принимает данные просто от заданного айпишника.
программа работает автономно. она определяет есть ли связь по эзеренту, если есть то пересылает данные, если ее нет, то сохраняет их у себя в памяти,а при восстановлении выдает их в сеть.
Код: Выделить всё
i:=send(s,buf[0],0,MSG_NOSIGNAL);на целевом компьютере ничего не получится сделать, так как там специальный софт принимает данные просто от заданного айпишника.
программа работает автономно. она определяет есть ли связь по эзеренту, если есть то пересылает данные, если ее нет, то сохраняет их у себя в памяти,а при восстановлении выдает их в сеть.
Re: связь по ethernet
Все равно не вполне понятна задача. Вам ведь недостаточно знать о доступности "того" компьютера, нужно быть уверенным, что "там" запущено нужное приложение и оно "слушает" сокет.
Насчет кода, который Вы привели. buf - это строка или массив?
Если строка, то может нужно писать buf[1] ? И как Вы предполагаете передать 0 байт?
Может Вам стоит попробовать асинхронные сокеты. Там есть событие подтверждения установки соединения. Правда их реализация в Linux "хромает слегка".
Насчет кода, который Вы привели. buf - это строка или массив?
Если строка, то может нужно писать buf[1] ? И как Вы предполагаете передать 0 байт?
Может Вам стоит попробовать асинхронные сокеты. Там есть событие подтверждения установки соединения. Правда их реализация в Linux "хромает слегка".
Re: связь по ethernet
Когда на другом компьютере запускается тсп-клиент, то соответственно создается сокет, по которому передаются данные. buf-это массив. в предложенной строке передается 0 символов, соответственно если ничего не передается, то i=-1, а если передаст, то i=0. при помощи этого я и проверял наличие связи. В целом работает, но иногда при отключении провода, программа не видит отсутствия сети
Re: связь по ethernet
Yurakl
У Вас ошибка в алгоритме проверки.
Вам надо проверять не доступность ethernet, а доступность того компьютера.
Ping это позволяет, так как получает ответ от конкретного того компьютера, а не от некоего мифического существа под названием "ethernet". 
У Вас ошибка в алгоритме проверки.
Вам надо проверять не доступность ethernet, а доступность того компьютера.
Re: связь по ethernet
Vadim
Подскажите, как тогда на лазарусе это проверить?
и на самом деле мне нужен не пинг с другим компьюетром,а именно есть ли связь.
Так как данные принимает специальное ПО(тсп-клиент), и если оно выключено, то связи нет и тогда данные не должны передаваться, а пинг будет
Подскажите, как тогда на лазарусе это проверить?
и на самом деле мне нужен не пинг с другим компьюетром,а именно есть ли связь.
Так как данные принимает специальное ПО(тсп-клиент), и если оно выключено, то связи нет и тогда данные не должны передаваться, а пинг будет
Re: связь по ethernet
Yurakl писал(а):Так как данные принимает специальное ПО(тсп-клиент), и если оно выключено, то связи нет
Значить нужен список признаков, по которым можно точно определить, что это ПО запущено.
Итак, каковы эти признаки?
Re: связь по ethernet
если ПО запущено, то тсп-сервер включен, настроенный на заданный айпишник и порт, а следовательно создается сокет между ПО и программой
Re: связь по ethernet
сначала пинг на доступность той машины
а потом проверяйте открыт ли порт который использует та спецпрога на той машине
а потом проверяйте открыт ли порт который использует та спецпрога на той машине
- evd
- новенький
- Сообщения: 21
- Зарегистрирован: 13.09.2009 09:42:28
- Откуда: Вологда
- Контактная информация:
Re: связь по ethernet
А программа на другом компьютере тоже самописная?
Если да, то почему бы той программе не возвращать результат операции?
Т.е. псевдокод клиента выглядит так:
В этом случае будет гарантия не только что данные передались, но и то что данные программа-сервер обработала (например сохранила в базе)
Если да, то почему бы той программе не возвращать результат операции?
Т.е. псевдокод клиента выглядит так:
Код: Выделить всё
Send(..); //отправляем данные
s:=ReadString(); //считываем результат операции
if SameText(s,'OK') then
//Данные успешно передались и программа-сервер данные обработала
else
//Данные не передались
В этом случае будет гарантия не только что данные передались, но и то что данные программа-сервер обработала (например сохранила в базе)
Re: связь по ethernet
программа самописная, но ней мной. Да и в принципе любой тсп-клиент должен работать с ней.
Мне необходимо в моей программе только что-то поправить, и никакой другой софт переписывать не надо.
Мне необходимо в моей программе только что-то поправить, и никакой другой софт переписывать не надо.
- alexs
- долгожитель
- Сообщения: 4066
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
Re: связь по ethernet
Медитируем над модулем ssockets
Смотри в папке исходников - fpcsrc/packages/fcl-base/examples файлы
dsockcli.pp
dsocksvr.pp
если не страшно - о компилируем их
запускам сервер
потом клиента и удивляемся как всё просто.
Смотри в папке исходников - fpcsrc/packages/fcl-base/examples файлы
dsockcli.pp
dsocksvr.pp
если не страшно - о компилируем их
запускам сервер
потом клиента и удивляемся как всё просто.
Re: связь по ethernet
alexs
и что же эти файлы сделают???
а как-нибудь в программе в лазараусе можно что-то добавить или изменить???
и что же эти файлы сделают???
а как-нибудь в программе в лазараусе можно что-то добавить или изменить???
Re: связь по ethernet
А какой протокол используете? В TCP реализована поддержка гарантии доставки как таковая, если данные не доставлены возникают стандартные ошибки (с виде исключений или ещё как, зависит от реализации) все что остается это отлавливать эти ошибки.
Если же UDP то там надо реализовать свой механизм подтверждения доставки целостности данных.
Если же UDP то там надо реализовать свой механизм подтверждения доставки целостности данных.
