Конференция "Сети" » icmp result после udp send
 
  • guard_gg (19.01.08 18:01) [0]
    Предположим что udp (indi или другой без разницы) клиент посылает пакет на удаленный хост на закрытый udp порт.
    Смотрим в фаервол и видим что пришел icmp result либо с самого хоста либо с маршрутизатора "получатель не доступен".
    Процесс system.exe вроде.
    1) А как я могу получить чтобы потом обработать данный пакет в Дельфи?

    2) И правильно ли я полагаю что одним из способов провереять наличие хостов в сети можно посылая пакет на udp и в случае если ответил хост то он жив а в случае если маршрутизатор то хост мертв?
  • DVM © (19.01.08 18:18) [1]
    Ты хочешь PING сделать что ли?
  • Сергей М. © (19.01.08 18:29) [2]

    > 2)


    Неправильно.
  • Anatoly Podgoretsky © (19.01.08 23:16) [3]
    > guard_gg  (19.01.2008 18:01:00)  [0]

    А если не пришел, то бросаем монетку?
  • guard_gg (22.01.08 02:09) [4]
    Пинг делать не хочу, он и так есть =)

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

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

    ///////////////////////////////////////////////////////////////////////////
    Если конкретно то нужно мне научиться работать на нижних уровнях программирования сокетов. Чтобы просто при отсылании пакета на удаленный udp порт уметь получать результат и както обрабатывать програмно
    Пока что приходиться тестировать проект за счет фаервола и самому ему результат подсказывать =D
  • ketmar © (22.01.08 12:30) [5]
    >[4] guard_gg (22.01.08 02:09)
    >нужно мне научиться работать на нижних уровнях программирования сокетов
    udp не является «нижним уровнем».
  • DVM © (22.01.08 14:54) [6]

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

    А с какого перепугу тебе обязательно пришлют результат/ответ? Даже если получатель пакет получил ты об этом точно не узнаешь.
  • guard_gg (24.01.08 02:12) [7]
    На нижнем уровне ПРОГРАММИРОВАНИЕ СОКЕТОВ а НЕ OSI!!!
    то есть НЕ способом "кинул компоненту на форму а та и заработала"

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

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

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

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

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

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

    А под WinSock даже как я понял из WinSDKHelp даже сокета навороченного не создашь. нужен winsock2 модуль
  • DVM © (24.01.08 11:10) [8]

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

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

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


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

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


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

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


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

    Ты по человечески объясни по шагам, что ты хочешь сделать. Ибо из написанного выше мало понятно.
  • guard_gg (06.02.08 02:10) [9]
    По человечески:
    Как перед отправкой сообщения на UDP порт узнать открыт он или нет?
    (кратко как только смог)
  • Andru © (06.02.08 09:44) [10]
    Если порт никто не слушает, то следующий send вернет ошибку, а WSAGetLastError вернет WSAECONNRESET.
  • ага (06.02.08 12:17) [11]
    2 guard_gg

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

    PS На всякий случай - я видел, что UDP.
  • ага (06.02.08 12:19) [12]
    Да, после этого разумеется придется использовать Send вместо SendTo etc.
  • Evgeny V © (06.02.08 14:33) [13]

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

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


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

    В UDP Connect - это скорее для упрощения работы... имхо.
  • ага (06.02.08 18:09) [14]
    2 Evgeny V

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

    Одно другому не мешает. По сути SendTo/RecvFrom внутри делают тот-же Connect, потом отправку, потом отключение. При каждом вызове. Вот и получается, что ты отправил SendTo, пакет ушел в сеть, на него пришел ответ "нетути такого", а система не знает, кому его отдать. Ну и выбрасывает, ясен пень. А если сокет подключенный, то система видит - "вот он, отправитель. Шлет, понимашь, куды ни попадя, пусть сам с ошибками и разбирается."
  • guard_gg (06.02.08 18:32) [15]

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


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

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

    Чево? В сад.
  • guard_gg (06.02.08 22:09) [17]

    > Чево? В сад.

    Слушай остынь, ну может хреново сказал, когда на такие темы разговариваешь про себя сам с собой потом с трудом можешь даже в письменном виде высказаться. У меня нет друзей единамышленников а в нете я не часто с кем нить на эти темы общаюсь. Вот посмотри на себя, сам то каким был?
  • Slym © (07.02.08 06:14) [18]
    ага   (06.02.08 12:17) [11]
    Connect

    какой конект? UDP - мессаже ориентированный протокол... т.е. "соединение" состоит из 1 единственной, никчему не обязывающей датаграмы... а полноценное соединение как минимум подрузумевает handshake хотябы примитивный, а это минимум 2 пакета: туда и обратно
  • Evgeny V © (07.02.08 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%-ой гарантии, что что ты получишь что-то обратно в качестве ответа.
 
Конференция "Сети" » icmp result после udp send
Есть новые Нет новых   [134431   +15][b:0][p:0.001]