|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
04.07.2010, 13:53 | #1 |
Новичок
Джуниор
Регистрация: 04.07.2010
Сообщений: 38
|
Программно отменить запрос на подключение
Добрый день.
Вот недавно захотелось написать программу для поиска ftp серверов в локальной сети. (VS C++ .Net Framework >=2.0 ) Но, возникла проблема. Дело в том, что объект System::Net::FtpWebResponse фактически представляет из себя FTP клиент, НО, мне нужно не совсем это. Мне нужно создавать запрос на подключение сразу по нескольких IP адресах и ожидать ответа ( ЗАДАННОЕ время ). Но способа задать это время ожидания ответа на соединение , как раз никак и не могу найти. Перерыл много всякого хлама. Есть еще веселый объект System::Net::Sockets::TcpClient по сути является надстройкой объекта Socket, но и там после того как выполняется запрос на соединение я никак не могу прервать этот запрос, например через 2-3 сек, а не ждать секунд 20, как обычно это происходит, пока получу ответ, что соединение не удалось. Пример: TotalCommander , при попытке соединиться с Ftp сервером есть кнопка прервать соединение, так вот про эту кнопку я и спрашиваю ( образно). Если кто то знает что либо по этому поводу, пожалуйста подскажите, где и какой метод или функция для этого используется. Последний раз редактировалось Loji; 04.07.2010 в 14:01. |
04.07.2010, 14:19 | #2 |
Unix C++ developer
Форумчанин
Регистрация: 16.04.2007
Сообщений: 651
|
Обычно это делается так (в обычном с/с++):
1. Создается Неблокирующий сокет. 2. В отдельном потоке запускается цикл, выполняющий коннект/отправку/запрос данных через сокет. т.к. сокет неблокирующий - цикл в любой момент можно остановить. |
04.07.2010, 18:09 | #3 | |
Новичок
Джуниор
Регистрация: 04.07.2010
Сообщений: 38
|
Цитата:
Например, Net::Sockets::TcpClient^ tcp=gcnew Net::Sockets::TcpClient(); tcp->Client->Blocking=false; while(true){ ... tcp->Client->Connect("ftp...",21); } // А вот тут и проблемы, а именно программирование незаблокированного сокета под CLR С++. Хотя бы примера, создания на CLR С++ такого сокета не нашел, в MSDN его тоже нет. В гугле тоже не нашел. Вот так вот ----------------------------------------------------------- Проблему буду решать таким способом: Net::Sockets::Socket^sock = gcnew Net::Sockets::Socket(Net::Sockets:: AddressFamily::InterNetwork,Net::So ckets::SocketType::Stream,Net::Sock ets::ProtocolType::Tcp); sock->Blocking=false; sock->NoDelay=true; sock->SetSocketOption(Net::Sockets::Sock etOptionLevel::Socket,Net::Sockets: :SocketOptionName::KeepAlive,true); sock->SendBufferSize=1; try { sock->Connect("...",21); } catch (Net::Sockets::SocketException^ e) { } System::Threading::Thread::Sleep(60 00); sock->Close(); Но не все так просто. Объект Socket состоит ( похоже ) из 2х частей ( клиентской и системной ) , так вот метод sock->Close(); удаляет лишь клиентскую реализацию объекта с удалением ссылки на его системную реализацию. Иными словами, после удаления sock->Close(); сам объект все еще продолжает висеть в системе и ожидать ответа на соединение ( любой сетевой экран покажет ), и как обычно только через 20 секунд, система видит что на него ничто не ссылается больше и он удаляется ( якобы ). Выход из блокирующего режима лишь прекращает ожидание ответа с клиентской стороны , то ничего не меняет на системной, поэтому и выбрасывается исключение, - что "оно ушло' не дождавшись ответа системы, но так же висит в системе 20 секунд , как и раньше. И вообще получается что ничто не может сократить время ожидания запроса на соединение ( после долгих танцев нифига не получилось ), как было 20 секунд так и есть. Отдельный поток , тоже не приводит в его удалению в системе. Возможно sock->Handle как то поможет, но вникать в API нет ни желания ни времени. Если кто то знает больше по этому вопросу и может хоть чем то помочь, милости прошу. Последний раз редактировалось Loji; 04.07.2010 в 21:47. |
|
04.07.2010, 23:54 | #4 |
Unix C++ developer
Форумчанин
Регистрация: 16.04.2007
Сообщений: 651
|
А зачем все так усложнять?
Почему бы не сделать на обычном С++ с обычными беркли сокетами ? |
05.07.2010, 13:06 | #5 | |
Новичок
Джуниор
Регистрация: 04.07.2010
Сообщений: 38
|
Цитата:
Так вот в Native C++ Intellisense очень неудобный, MSDN весь на английском , - я знаете ли уже как бы отвык от всех этих бредней после перехода на CLR , и возвращаться , разбираться с библиотекой winsock2.h как то не особо горю желанием. К тому же я не уверен что результат будет другим. Последний раз редактировалось Loji; 05.07.2010 в 13:09. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Подключение базы данных программно | doniyor | БД в Delphi | 5 | 17.04.2012 09:41 |
подключение двух компьютеров к интернет через одно подключение | Chudo4258 | Помощь студентам | 3 | 30.03.2010 16:07 |
Как отменить поток | RIO | Общие вопросы Delphi | 11 | 12.10.2009 00:29 |
Как отменить процедуру? | KoBRaAndrey | Общие вопросы Delphi | 5 | 05.10.2009 11:12 |
Отменить закрытие окна | ds.Dante | Общие вопросы .NET | 3 | 01.10.2009 17:30 |