Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.07.2010, 13:53   #1
Loji
Новичок
Джуниор
 
Регистрация: 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.
Loji вне форума Ответить с цитированием
Старый 04.07.2010, 14:19   #2
oleg kutkov
Unix C++ developer
Форумчанин
 
Аватар для oleg kutkov
 
Регистрация: 16.04.2007
Сообщений: 651
По умолчанию

Обычно это делается так (в обычном с/с++):
1. Создается Неблокирующий сокет.
2. В отдельном потоке запускается цикл, выполняющий коннект/отправку/запрос данных через сокет. т.к. сокет неблокирующий - цикл в любой момент можно остановить.
oleg kutkov вне форума Ответить с цитированием
Старый 04.07.2010, 18:09   #3
Loji
Новичок
Джуниор
 
Регистрация: 04.07.2010
Сообщений: 38
По умолчанию

Цитата:
Сообщение от oleg kutkov Посмотреть сообщение
Обычно это делается так (в обычном с/с++):
1. Создается Неблокирующий сокет.
2. В отдельном потоке запускается цикл, выполняющий коннект/отправку/запрос данных через сокет. т.к. сокет неблокирующий - цикл в любой момент можно остановить.
Логика, ясна
Например,
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.
Loji вне форума Ответить с цитированием
Старый 04.07.2010, 23:54   #4
oleg kutkov
Unix C++ developer
Форумчанин
 
Аватар для oleg kutkov
 
Регистрация: 16.04.2007
Сообщений: 651
По умолчанию

А зачем все так усложнять?
Почему бы не сделать на обычном С++ с обычными беркли сокетами ?
oleg kutkov вне форума Ответить с цитированием
Старый 05.07.2010, 13:06   #5
Loji
Новичок
Джуниор
 
Регистрация: 04.07.2010
Сообщений: 38
По умолчанию

Цитата:
Сообщение от oleg kutkov Посмотреть сообщение
А зачем все так усложнять?
Почему бы не сделать на обычном С++ с обычными беркли сокетами ?
На самом деле я не усложняю, а у прощаю. Если вы внимательно читали , было написано - в среде CLR С++ , а не Native C++.
Так вот в Native C++ Intellisense очень неудобный, MSDN весь на английском , - я знаете ли уже как бы отвык от всех этих бредней после перехода на CLR , и возвращаться , разбираться с библиотекой winsock2.h как то не особо горю желанием.
К тому же я не уверен что результат будет другим.

Последний раз редактировалось Loji; 05.07.2010 в 13:09.
Loji вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подключение базы данных программно 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