Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как узнать установлено ли соединение, для udp сокета 
:(
    Опции темы
Competitor
Дата 8.2.2007, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 23.3.2005
Где: Tula

Репутация: нет
Всего: -1



После инициализации сокета и вызова метода Connect() каким образом можно узнать, установлено ли соединение или нет?
Код

            IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(serverHost), port);
            Socket socket = new Socket(ipe.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
            socket.Connect(ipe);


Ведь при попытке соединения с заведомо закрытым портом свойство socket.Connected все равно установлено в true
PM MAIL WWW   Вверх
Gelis
Дата 8.2.2007, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 26.10.2006
Где: Брест

Репутация: нет
Всего: 4



Так ведь UDP он на то и UDP - что это протокол без создания соединения.
Можно правда попробавать от клиента отправлять сразу же мессагу о том что пакет пришел.

Это сообщение отредактировал(а) Gelis - 8.2.2007, 21:15
PM MAIL   Вверх
Competitor
Дата 9.2.2007, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 23.3.2005
Где: Tula

Репутация: нет
Всего: -1



Ну хорошо. А как тогда узнать открыт порт или закрыт?
PM MAIL WWW   Вверх
-Mikle-
Дата 9.2.2007, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 1
Всего: 59



ИМХО никак, наверное... smile 

Цитата(Gelis @  9.2.2007,  00:09 Найти цитируемый пост)
Так ведь UDP он на то и UDP - что это протокол без создания соединения.

а это значит что посылающему по UDP, должно быть безразлично, есть там кто-то или нет, открыт порт, или закрыт... короче пофиг ему должно быть на все, раз он UDP...

Добавлено @ 16:12 
для какой цели то тебе понадобилось проверять есть ли по UDP слушающий? Что-то необычное должно быть...


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
Competitor
Дата 9.2.2007, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 23.3.2005
Где: Tula

Репутация: нет
Всего: -1



В инете прочитал, что можно использовать метод write(). Типа если порт закрыт, то метод вернет ошибку.
Только вот куда записывать? В поток? Каким образом. У кого-нить есть предложения. Чтобы не быть многословными давайте сразу пример
PM MAIL WWW   Вверх
-Mikle-
Дата 9.2.2007, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 1
Всего: 59



На практике только что попробовал с Socket и с UdpClient вызывать метод SendTo и Send соответственно, ни один не дал ошибку... точно о UDP шла речь?


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
Competitor
Дата 9.2.2007, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 23.3.2005
Где: Tula

Репутация: нет
Всего: -1



Цитата

точно о UDP шла речь

Сканирование UDP-портов проверкой ICMP-сообщения "Порт недоступен"
Большинство серверов в ответ на пакет, прибывший на закрытый UDP-порт, отправляют ICMP-сообщение "Порт недоступен" (Port Unreachable - PU). Таким образом, если в ответ на UDP-пакет пришло ICMP-сообщение PU, то сканируемый порт является закрытым, в противном случае (при отсутствии PU) порт открыт. Поскольку нет гарантии, что запросы от хоста дойдут до сервера, пользователь должен позаботиться о повторной передаче UDP-пакета, который, по всей видимости, оказался потерянным.

Сканирование UDP-портов с использованием функций recvfrom() и write()
Этот метод используется в случае, когда пользователь, проводящий сканирование, не обладает статусом Root на хосте. Поскольку не-root пользователь не может "читать" ICMP-сообщение PU, в ОС, поддерживающих механизм сокетов (например в Linux), имеется возможность получения информации о состоянии UDP-порта косвенным способом. Так, например, попытка вызова функции write() на закрытый порт обычно приводит к возникновению ошибки.
Функция recvfrom() в этом плане более информативна. Вызов ее на неблокированный UDP-сокет сервера обычно возвращает ошибку EAGAIN (Try Again - "попытайтесь еще раз", код 13) в случае, когда ICMP-сообщение не было принято, и ECONREFUSED (Connection Refused - "соединение закрыто", код 111), если ICMP-сообщение было принято. Таким образом, по этим признакам также возможно определить состояние портов сканируемого сервера. 
Взято из http://cherepovets-city.ru/insecure/runmap...ap-portscan.htm
PM MAIL WWW   Вверх
Competitor
Дата 9.2.2007, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 23.3.2005
Где: Tula

Репутация: нет
Всего: -1



Вот так вот можно определить открыт ли порт udp или нет:

Код

            IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(serverHost), portNum);
            EndPoint endPoint = new IPEndPoint(IPAddress.Parse(serverHost), portNum);
            Socket socket = new Socket(ipe.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
            byte[] sendbytes = Encoding.ASCII.GetBytes("Hello, my great friends");

            Socket icmpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp);
            byte[] icmpbytes = new byte[256];
            //socket.SendTo(sendbytes, ipe);
            icmpSocket.SendTo(icmpbytes, endPoint);

            socket.Connect(ipe);
            socket.Send(sendbytes, sendbytes.Length, 0);
            
            if (icmpSocket.ReceiveFrom(icmpbytes, ref endPoint) > 0)
                Console.WriteLine("Icmp message has been reseived. Port is not open");


Т.е. в случае, если порт оказывается закрыт, то сервак остылает клиенту icmp message.

Это сообщение отредактировал(а) Competitor - 9.2.2007, 19:42
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
cully
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, cully, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Распределённые приложения и сеть | Следующая тема »


 




[ Время генерации скрипта: 0.0455 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.