Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

icmp result после udp send


Страницы:   1 2

guard_gg ©   (2008-01-19 18:01:00) 

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

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


Evgeny V   (2008-02-08 12:54:00) [1]


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


> Ага. Щас

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


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


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

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


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

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


Evgeny V   (2008-02-08 06:45:00) [3]


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

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

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

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


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


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

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


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


> ага   (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 блокирующий и законнекченный....


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


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

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

Ну ладно, 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-07 14:05:00) [6]


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

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


Evgeny V   (2008-02-07 14:01:00) [7]


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

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


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

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


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

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


Evgeny V   (2008-02-07 13:59:00) [9]


> ага   (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]
относится еще меньше, впрочем как и последующие посты.


ketmar   (2008-02-07 13:58:00) [10]

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

---
Understanding is not required. Only obedience.


Slym   (2008-02-07 13:57:00) [11]

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

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


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

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

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


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


> ага   (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:34:00) [14]


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

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

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

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


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

2 Evgeny V ©

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

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


Evgeny V   (2008-02-07 07:01:00) [16]


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

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


Evgeny V   (2008-02-07 06:57:00) [17]


> ага   (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%-ой гарантии, что что ты получишь что-то обратно в качестве ответа.


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

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

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


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


> Чево? В сад.

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


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


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

Чево? В сад.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо