Конференция "Сети" » icmp result после udp send
 
  • Evgeny V © (07.02.08 07:01) [20]

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

    Тем не менее вызов Connect для UDP сокета осуществить можно:-) Он просто устанавливает адрес удаленного хоста по умолчанию, что бы можно было пользоваться функцией send, без явного указания адреса получателя. Соединения как в TCP конечно нет.
  • ага (07.02.08 13:25) [21]
    2 Evgeny V ©

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

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

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

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

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

    Не, не надо. Тем паче на обшарпанном. У меня того кода - завались.
  • Evgeny V © (07.02.08 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.
  • ага (07.02.08 13:56) [24]
    "Представим, что надо послать UDP-датаграмму, но никакой процесс на другой стороне не прослушивает порт назначения. Протокол UDP на другом конце вернет ICMP-сообщение о недоступности порта, информируя тем самым ваш стек TCP/IP, но если сокет не подсоединен, то приложение не получит уведомления. Когда вы вызываете sendto, в начало сообщения добавляется заголовок, после чего оно передается уровню IP, где инкапсулируется в IP-датаграмму и помещается в выходную очередь интерфейса. Как только датаграмма внесена в очередь ( или отослана, если очередь пуста ), sendto возвращает управление приложению с кодом нормального завершения. Иногда через некоторое время ( отсюда и термин асинхронный ) приходит ICMP-сообщение от хоста на другом конце. Хотя в нем есть копия UDP-заголовка, у вашего стека нет информации о том, какое приложение посылало датаграмму (...). Если же сокет подсоединен, то этот факт отмечается в управляющем блоке протокола, связанном с сокетом, и стек TCP/IP может сопоставить полученную копию UDP-заголовка с тем, что хранится в PCB, чтобы определить, в какой сокет направить ICMP-сообщение."
    Йон Снейдер (c).

    Имеющий глаза - да прочитает, имеющий мозги - да поймет.
    Я все сказал. Хау. Что в переводе на русский означает "ага".
  • Slym © (07.02.08 13:57) [25]
    ага   (07.02.08 13:25) [21]
    что такое подсоединенный UDP-сокет

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

    ---
    Understanding is not required. Only obedience.
  • Evgeny V © (07.02.08 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]
    относится еще меньше, впрочем как и последующие посты.
  • ага (07.02.08 14:01) [28]
    И че, что на винде она перекрывает адрес, если вызвать sendto на подключенный сокет? Че это меняет по сути? В общем, не работает - значит не работает. А мне это все приснилось.
  • Evgeny V © (07.02.08 14:01) [29]

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

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


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

    Нет о подсединенном, к которому была вызвана функция connect, в MSDN есть о connect и UDP
  • Evgeny V © (07.02.08 14:05) [30]

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

    По сути ничего, кроме того, что это работает в винде и на подсоединенном и на неподсоединенном сокете. У ваша манера мне напоминает другой ник или даже пару ников, которые тут  обитают(обитали) и любят неаргументированные наезды и цитаты дергают тоже отвсюду.Проверьте сперва, а потом делайте уж большие глаза
  • ага (07.02.08 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 © (08.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 © (08.02.08 06:45) [33]

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

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

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

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


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


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

    читать как повторный send
  • ага (08.02.08 12:12) [34]

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

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


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

    Ага. Щас. Тока тапочки почищу, а то че-то не блестят.
    Блин:(
  • Evgeny V © (08.02.08 12:54) [35]

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


    > Ага. Щас

    Я вам предлагал проверить на моем коде C#, а  сейчас есть и на дельфи, но я так понимаю отладчиком по десятку строчек пройтись трудно или не умеем? На нет и суда нет. Учить вас - упаси боже...
 
Конференция "Сети" » icmp result после udp send
Есть новые Нет новых   [134431   +14][b:0][p:0.001]