Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2009.04.26;
Скачать: [xml.tar.bz2];

Вниз

icmp result после udp send   Найти похожие ветки 

 
guard_gg   (2008-01-19 18:01) [0]

Предположим что udp (indi или другой без разницы) клиент посылает пакет на удаленный хост на закрытый udp порт.
Смотрим в фаервол и видим что пришел icmp result либо с самого хоста либо с маршрутизатора "получатель не доступен".
Процесс system.exe вроде.
1) А как я могу получить чтобы потом обработать данный пакет в Дельфи?

2) И правильно ли я полагаю что одним из способов провереять наличие хостов в сети можно посылая пакет на udp и в случае если ответил хост то он жив а в случае если маршрутизатор то хост мертв?


 
DVM ©   (2008-01-19 18:18) [1]

Ты хочешь PING сделать что ли?


 
Сергей М. ©   (2008-01-19 18:29) [2]


> 2)


Неправильно.


 
Anatoly Podgoretsky ©   (2008-01-19 23:16) [3]

> guard_gg  (19.01.2008 18:01:00)  [0]

А если не пришел, то бросаем монетку?


 
guard_gg   (2008-01-22 02:09) [4]

Пинг делать не хочу, он и так есть =)

Подозревал что не праильно ну уж часто на практике так было

Если не пришел то значит или киска его сьела или порт открыт
так что шутка не удалась, теорию udp я немного знаю

///////////////////////////////////////////////////////////////////////////
Если конкретно то нужно мне научиться работать на нижних уровнях программирования сокетов. Чтобы просто при отсылании пакета на удаленный udp порт уметь получать результат и както обрабатывать програмно
Пока что приходиться тестировать проект за счет фаервола и самому ему результат подсказывать =D


 
ketmar ©   (2008-01-22 12:30) [5]

>[4] guard_gg (22.01.08 02:09)
>нужно мне научиться работать на нижних уровнях программирования сокетов
udp не является «нижним уровнем».


 
DVM ©   (2008-01-22 14:54) [6]


> Чтобы просто при отсылании пакета на удаленный udp порт
> уметь получать результат и както обрабатывать програмно

А с какого перепугу тебе обязательно пришлют результат/ответ? Даже если получатель пакет получил ты об этом точно не узнаешь.


 
guard_gg   (2008-01-24 02:12) [7]

На нижнем уровне ПРОГРАММИРОВАНИЕ СОКЕТОВ а НЕ OSI!!!
то есть НЕ способом "кинул компоненту на форму а та и заработала"

---------------
Логика такая:
-- Если результат не прийдет - то OPEN / FILTERED
{тоесть либо открыт и можно продолжать передачу данных, либо его отфильтровал маршрутизатор выясниться уже при попытке заговорить с конкретном сервисом}

-- Если прийдет от маршрутизатора или хоста ICMP "получатель не доступен" то проинформировать об этом пользователя в виде ошибки соединения

Ну я же не прошу Вас выкладывать выкладывать военные тайны в повышенном обьеме. просто прошу в двух предложениях сказать где копать и как =)

Если кто сможет скинуть examle на любом из языков программирования кроме ассемблера =) то буду весьма благодарен

Великий гугл про сокеты детскую инфу предлогает.

Я бы сам смог разобраться да вот тока в модулях INDI .pas файлов нету, тока компилированные .dcu. прочие компоненты с сокетами такие же. копирайт всетаки =(

А под WinSock даже как я понял из WinSDKHelp даже сокета навороченного не создашь. нужен winsock2 модуль


 
DVM ©   (2008-01-24 11:10) [8]


> На нижнем уровне ПРОГРАММИРОВАНИЕ СОКЕТОВ а НЕ OSI!!!

Ты бред то не неси откровенный. Нижний уровень модели OSI ты хоть знаешь как называется и к чему относится? Нижний уровень - физический.

Тебе же доступен максимум 3 уровень - сетевой, на котором функционирует протокол IP в частности. И все уровни выше.


> Я бы сам смог разобраться да вот тока в модулях INDI .pas
> файлов нету, тока компилированные .dcu. прочие компоненты
> с сокетами такие же. копирайт всетаки =(

Исходники есть в интернет на сайте инди.


> А под WinSock даже как я понял из WinSDKHelp даже сокета
> навороченного не создашь. нужен winsock2 модуль

Ну и используй WinSock2. Заголовочный файл WinSock2.pas везде валяется.


> Ну я же не прошу Вас выкладывать выкладывать военные тайны
> в повышенном обьеме. просто прошу в двух предложениях сказать
> где копать и как =)

Ты по человечески объясни по шагам, что ты хочешь сделать. Ибо из написанного выше мало понятно.


 
guard_gg   (2008-02-06 02:10) [9]

По человечески:
Как перед отправкой сообщения на UDP порт узнать открыт он или нет?
(кратко как только смог)


 
Andru ©   (2008-02-06 09:44) [10]

Если порт никто не слушает, то следующий send вернет ошибку, а WSAGetLastError вернет WSAECONNRESET.


 
ага   (2008-02-06 12:17) [11]

2 guard_gg

Чтобы получить результат, сокет должен быть "соединенным". Вывод - нужно подключить сокет, т.е. Connect(...)

PS На всякий случай - я видел, что UDP.


 
ага   (2008-02-06 12:19) [12]

Да, после этого разумеется придется использовать Send вместо SendTo etc.


 
Evgeny V ©   (2008-02-06 14:33) [13]


> Andru ©   (06.02.08 09:44) [10]
> Если порт никто не слушает, то следующий send вернет ошибку,
>  а WSAGetLastError вернет WSAECONNRESET

А не recv / recvfrom??
Все равно полной гарантии нет в получении такого сообщения...


> ага   (06.02.08 12:17) [11]

В UDP Connect - это скорее для упрощения работы... имхо.


 
ага   (2008-02-06 18:09) [14]

2 Evgeny V

> В UDP Connect - это скорее для упрощения работы... имхо.

Одно другому не мешает. По сути SendTo/RecvFrom внутри делают тот-же Connect, потом отправку, потом отключение. При каждом вызове. Вот и получается, что ты отправил SendTo, пакет ушел в сеть, на него пришел ответ "нетути такого", а система не знает, кому его отдать. Ну и выбрасывает, ясен пень. А если сокет подключенный, то система видит - "вот он, отправитель. Шлет, понимашь, куды ни попадя, пусть сам с ошибками и разбирается."


 
guard_gg   (2008-02-06 18:32) [15]


> Одно другому не мешает. По сути SendTo/RecvFrom внутри делают
> тот-же Connect, потом отправку, потом отключение. При каждом
> вызове. Вот и получается, что ты отправил SendTo, пакет
> ушел в сеть, на него пришел ответ "нетути такого", а система
> не знает, кому его отдать. Ну и выбрасывает, ясен пень.
> А если сокет подключенный, то система видит - "вот он, отправитель.
>  Шлет, понимашь, куды ни попадя, пусть сам с ошибками и
> разбирается."
>


(пробовал но не уверен)
Ну даж не знаю, обычно все пакеты result svchost.exe кушает и не с кем не хочет делиться даж если сокет пытается recv делать
На счет Send/To не уверен так как сообщение error не узнавал че возращает.
А вот Recv как раз таки на закрытый порт заставляет Application окно с ошибкой выдавать. Естественно предполагал что можно по OnException обрабатывать да только мне показалось что слишком криво это все получаться бут. Я же всетаки надеялся что можно результат будет получать нормальным путем и обрабатывать основываясь на содержимом пакета а не ошибке приложения


 
ага   (2008-02-06 19:17) [16]


> А вот Recv как раз таки на закрытый порт заставляет Application
> окно с ошибкой выдавать. Естественно предполагал что можно
> по OnException обрабатывать да только мне показалось что
> слишком криво это все получаться бут.

Чево? В сад.


 
guard_gg   (2008-02-06 22:09) [17]


> Чево? В сад.

Слушай остынь, ну может хреново сказал, когда на такие темы разговариваешь про себя сам с собой потом с трудом можешь даже в письменном виде высказаться. У меня нет друзей единамышленников а в нете я не часто с кем нить на эти темы общаюсь. Вот посмотри на себя, сам то каким был?


 
Slym ©   (2008-02-07 06:14) [18]

ага   (06.02.08 12:17) [11]
Connect

какой конект? UDP - мессаже ориентированный протокол... т.е. "соединение" состоит из 1 единственной, никчему не обязывающей датаграмы... а полноценное соединение как минимум подрузумевает handshake хотябы примитивный, а это минимум 2 пакета: туда и обратно


 
Evgeny V ©   (2008-02-07 06:57) [19]


> ага   (06.02.08 18:09) [14]


> Вот и получается, что ты отправил SendTo, пакет ушел в сеть,
>  на него пришел ответ "нетути такого", а система не знает,
>  кому его отдать. Ну и выбрасывает, ясен пень. А если сокет
> подключенный, то система видит - "вот он, отправитель.

это интуитивно?:-)
Нет.
И в том и в другом случае получаем один результат, по recv/recvfrom получаю ошибку 10054. Могу дать код на С#, если есть желание проверить в отладчике два варианта, с Connect и без него, когда и как выскакивает ошибка. А можешь и сам написать на winsock.


> guard_gg   (06.02.08 18:32) [15]

Насчет кривости - не знаю Indy, не работаю давно в дельфи,но в .Net например все ошибки сокетов передаются через SocketException, так что try / catch (try/ except  в дельфи) вполне помогают. Но повторюсь, в любом случае нет 100%-ой гарантии, что что ты получишь что-то обратно в качестве ответа.


 
Evgeny V ©   (2008-02-07 07:01) [20]


> Slym ©   (07.02.08 06:14) [18]

Тем не менее вызов Connect для UDP сокета осуществить можно:-) Он просто устанавливает адрес удаленного хоста по умолчанию, что бы можно было пользоваться функцией send, без явного указания адреса получателя. Соединения как в TCP конечно нет.


 
ага   (2008-02-07 13:25) [21]

2 Evgeny V ©

> это интуитивно?:-)
> Нет.

Что "нет"? Что не интуитивно? Да, не интуитивно. Откуда? Из самых разных источников. Например, сейчас под рукой Йон Снейдер, "Эффективное программирование TCP/IP", стр.234 - 238. Глава так и называется "Совет 30. Разберитесь, что такое подсоединенный UDP-сокет". Типа намек, ага?


 
ага   (2008-02-07 13:34) [22]


> И в том и в другом случае получаем один результат, по recv/recvfrom
> получаю ошибку 10054

Какой нафиг Recv? Вопрос читал?

> Могу дать код на С#, если есть желание проверить в отладчике
> два варианта, с Connect и без него, когда и как выскакивает
> ошибка.

Не, не надо. Тем паче на обшарпанном. У меня того кода - завались.


 
Evgeny V ©   (2008-02-07 13:51) [23]


> ага   (07.02.08 13:25) [21]

Нет -это значит под Windows это не так. Про книгу
У меня есть эта книга, там он пишет о ВCD и  unix, под Windows не все так реализовано. Кроме того я читал о connect, sendTo и много очем  в MSDN - и там надо сказать написанное мягко говоря противоречит кое-чему написанному у Снайдера (хотя бы тому же sendTo и присоединнму UDP сокету). А так как лучше проверить, чем просто верить, попробуйте протестировать. Напишите код и посмотрите. Или опять я вам предлагаю по шагам пройтись в коде, который я вам пришлю, только написан он на C#
И вот выдержка из MSDN
"The sendto function is normally used on a connectionless socket to send a datagram to a specific peer socket identified by the to parameter. Even if the connectionless socket has been previously connected to a specific address, the to parameter overrides the destination address for that particular datagram only. On a connection-oriented socket, the to and tolen parameters are ignored, making sendto equivalent to send.", а вот что пишет Снайдер -
"updconnl: ошибка вызова sendto: Socket is already connected (56)

bsd: $

Ошибка произошла из-за того, что вы вызвали sendto для подсоединенного сокета. При этом sendto потребовал от UDP временно подсоединить сокет. Но UDP определил, что сокет уже подсоединен и вернул код ошибки EISCONN."
Разница очевидна. Просто пишет он для юникс сокетов и книга надо сказать хорошая, но MSDN пишет для реализации Windows. Так что одних книг маловато будет... Надо бы и код иногда писать и проверять или просматривать MSDN.


 
ага   (2008-02-07 13:56) [24]

"Представим, что надо послать UDP-датаграмму, но никакой процесс на другой стороне не прослушивает порт назначения. Протокол UDP на другом конце вернет ICMP-сообщение о недоступности порта, информируя тем самым ваш стек TCP/IP, но если сокет не подсоединен, то приложение не получит уведомления. Когда вы вызываете sendto, в начало сообщения добавляется заголовок, после чего оно передается уровню IP, где инкапсулируется в IP-датаграмму и помещается в выходную очередь интерфейса. Как только датаграмма внесена в очередь ( или отослана, если очередь пуста ), sendto возвращает управление приложению с кодом нормального завершения. Иногда через некоторое время ( отсюда и термин асинхронный ) приходит ICMP-сообщение от хоста на другом конце. Хотя в нем есть копия UDP-заголовка, у вашего стека нет информации о том, какое приложение посылало датаграмму (...). Если же сокет подсоединен, то этот факт отмечается в управляющем блоке протокола, связанном с сокетом, и стек TCP/IP может сопоставить полученную копию UDP-заголовка с тем, что хранится в PCB, чтобы определить, в какой сокет направить ICMP-сообщение."
Йон Снейдер (c).

Имеющий глаза - да прочитает, имеющий мозги - да поймет.
Я все сказал. Хау. Что в переводе на русский означает "ага".


 
Slym ©   (2008-02-07 13:57) [25]

ага   (07.02.08 13:25) [21]
что такое подсоединенный UDP-сокет

Скорее всего имеется ввиду заBindеный сокет Bind(Socket,...)


 
ketmar ©   (2008-02-07 13:58) [26]

>[23] Evgeny V © (2008-02-07 13:51:00)
дык давно не секрет, что bsd-sockets и winsock — звери, похожие только внешне. и макияж криво на winsock нанесен.

---
Understanding is not required. Only obedience.


 
Evgeny V ©   (2008-02-07 13:59) [27]


> ага   (07.02.08 13:34) [22]

вызов recv возвращает ошибку о недоступности хоста, если была отправлена датаграмма на закрытый порт - это было комментарием к
> Andru ©   (06.02.08 09:44) [10]

, это работает суди по всему работает и у автора вопроса , что подтвердил и автор в
> guard_gg   (06.02.08 18:32) [15]

Если это не относится к теме вопроса, то ваш
> ага   (06.02.08 12:17) [11]
относится еще меньше, впрочем как и последующие посты.


 
ага   (2008-02-07 14:01) [28]

И че, что на винде она перекрывает адрес, если вызвать sendto на подключенный сокет? Че это меняет по сути? В общем, не работает - значит не работает. А мне это все приснилось.


 
Evgeny V ©   (2008-02-07 14:01) [29]


> ketmar ©   (07.02.08 13:58) [26]

Знаю, вопрос вроде идет в дельфи и по виндам:-)


> Slym ©   (07.02.08 13:57) [25]

Нет о подсединенном, к которому была вызвана функция connect, в MSDN есть о connect и UDP


 
Evgeny V ©   (2008-02-07 14:05) [30]


> ага   (07.02.08 14:01) [28]

По сути ничего, кроме того, что это работает в винде и на подсоединенном и на неподсоединенном сокете. У ваша манера мне напоминает другой ник или даже пару ников, которые тут  обитают(обитали) и любят неаргументированные наезды и цитаты дергают тоже отвсюду.Проверьте сперва, а потом делайте уж большие глаза


 
ага   (2008-02-07 17:00) [31]


> У ваша манера мне напоминает другой ник или даже пару ников,

Ну, у нашу манеру обсудить - святое дело, спору нет как раз в тему:)

Ну ладно, MSDN так MSDN. Не будет ли любезен многоуважаемый Evgeny V разъяснить мне, неразумному, смысл данной цитаты из MSDN:

send Function
...
WSAECONNRESET

The virtual circuit was reset by the remote side executing a hard or abortive close. For UDP sockets, the remote host was unable to deliver a previously sent UDP datagram and responded with a "Port Unreachable" ICMP packet. The application should close the socket as it is no longer usable.

Дабы не возникло подозрений в фальсификации, укажу адрес, откуда была взята вышеприведенная цитата:
http://msdn2.microsoft.com/en-us/library/ms740149.aspx


 
Evgeny V ©   (2008-02-08 06:32) [32]


> ага   (07.02.08 17:00) [31]

А что вам не понятно в этой цитате? Вам нужен перевод или вы хотите спросить что-то или обратить на что-то мое внимание?
На то, что ошибку вернет send? Я вам уже предлагал код, которым можно проверить цитаты. Я вам предлагал написать самому код, если вам не хочется воспользоваться своим и кодом показать, что и как работает. Вы склонны цитировать "библии". Я верю и MSDN и Снайдеру, но каждому в  своем случае(юниксу юниксово, а виндовсу видовсово), а еще больше я верю опыту, кода пишешь код и получаешь результат... Так вот по вами данной цитате -не возвращает у меня send на законекченном сокете udp ошибку, даже два и три раза и более раз подряд вызываю send вызов проходит успешно, а вот первый же после  send вызов recv вернул 10054.
Операционная система у меня стоит лицензионная Widows XP SP2. Аналогичное происходит и на соседнем компьютере у коллеги -тот же XP SP2
Сокет в блокирующем режиме если вам интересны подробности.

> guard_gg   (06.02.08 18:32) [15]

Судя по всему у автора вопроса присходит то же самое
Вывод MSDN тоже не панацея, читать надо, только обращать внимание на то что читаете и проверять в случае сомнений...  Попробуйте написать свой код и проверить у себя. Будут другие результаты с интересом ознакомлюсь.
Я не противник того, что могу да и на самом деле часто ошибаюсь. Но, не посылаю всех в сад
> ага   (06.02.08 19:17) [16],

на том основании, что у кого-то результаты опыта не такие, как я прочитал в какой-то из книг. Если ошибаюсь, то признаю это. Так что присылайте свой исходный код, проверим посмотрим, сравним... Есть дельфи - правда дома, на работе есть студия - можете выбрать дельфи или c# - я
PS: Проверил у коллеги на дельфи с WinSock, результат тот же,  send -нет ошибки, повторysq send - нет ошибки, recv ошибка 10054 Сокет UDP блокирующий и законнекченный....


 
Evgeny V ©   (2008-02-08 06:45) [33]


> Evgeny V ©   (08.02.08 06:32) [32]

Извиняюсь за ошибки в посте, писал не за один раз... работа..

Соотвественно фраза была не закончена в

> Есть дельфи - правда дома, на работе есть студия - можете
> выбрать дельфи или c# - я


читать как
 Есть дельфи - правда дома, на работе есть студия - можете
выбрать дельфи или c# - я посмотрю  код на любом из этих языков...


> повторysq send - нет ошибки

читать как повторный send


 
ага   (2008-02-08 12:12) [34]


>Но, не посылаю всех в сад > ага   (06.02.08 19:17) [16],

Блин:(
И че? Какое мне дело, кого куда вы там посылаете/не посылаете? Вы меня собираетесь учить морали? А с каких интересно пирогов? Вы собсна, кто таки а? У вас что, патент на самую моральную мораль среди мировых моралей? От кого? От ООН? От ЮНЕСКО? От лиги сексуальных меньшинств?
Да что ты будешь делать - куда ни ткни пальцем, везде носитель высшей морали под руку подвернется:( И обязательно тя учить норовит.


>Так что присылайте свой исходный код, проверим посмотрим, сравним

Ага. Щас. Тока тапочки почищу, а то че-то не блестят.
Блин:(


 
Evgeny V ©   (2008-02-08 12:54) [35]


> ага   (08.02.08 12:12) [34]


> Ага. Щас

Я вам предлагал проверить на моем коде C#, а  сейчас есть и на дельфи, но я так понимаю отладчиком по десятку строчек пройтись трудно или не умеем? На нет и суда нет. Учить вас - упаси боже...



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2009.04.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.007 c
2-1236556497
Юнец
2009-03-09 02:54
2009.04.26
Получить html тег


2-1236842605
Андрей Пл
2009-03-12 10:23
2009.04.26
Как сделать инсталяцию.


15-1235505481
TStas
2009-02-24 22:58
2009.04.26
Что такое печать в файл?


2-1237279953
igorntk
2009-03-17 11:52
2009.04.26
Как осуществить запись информации из TEdit


3-1220355661
Alexandra
2008-09-02 15:41
2009.04.26
Как изменить системную дату таблицы ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский