Текущий архив: 2003.01.13;
Скачать: CL | DM;
ВнизМожно ли перевести сокет из блокирующего в неблокирующий режим? Найти похожие ветки
← →
Repeater (2002-11-11 18:12) [40]>То, что connect() возвращает WSAEWOULDBLOCK в данной ситуации -
>это АБСОЛЮТНО НОРМАЛЬНО для неблок.режима !
Да, я это тоже в MSDN читал. Но тогда у меня все остальное не работает. WSAWaitForMultipleEvents, Send и recv возвращают ошибки.
>- циклическое ожидание сигнала события с возможным параллельным
>ожиданием оконных сообщений (MsgWaitForMultipleObjects)
Вот как это сделать? Это меня больше всего интересует.
← →
Repeater (2002-11-11 18:35) [41]Ошибочка, все работает. Я не туда смотрел. ;-))
Но есть другой трабл. После выхода из своей функции (я приводил ее еще раньше ConnectToProxy)выскакивает Access violation. Я проверил и выяснилось, что эта ошибка выскакивает только когда когда я описываю rmaddr:SOCKADDR_IN; локально в функции. Когда я глобально описал эту переменную, то ошибка больше не выскакивает. Соответственно вопрос. Очевидно, что ее, эту переменную, кто то еще хотел использовать, но так как функция завершилась и все лок. переменные были уничтожены, то получилось ошибочное обращение к памяти. Разве эта переменная используется все время пока сокет работает?
← →
Digitman (2002-11-12 08:30) [42]
> Разве эта переменная используется все время пока сокет работает?
Да, разумеется ! Только не "все время пока сокет работает", а "пока существует гнездо как ОС-объект", т.е. с момента вызова socket() до момента вызова closesocket().
Ты взгляни в код Борланда - ведь не спроста у него структура SOCKADDR_IN вынесена членом класса. А время жизни экземпляра класса TCustomWinSocket (в контексте методов которого и вызываются socket() ,closesocket()) заведомо больше, нежели время, проходящее между этими вызовами.
Учись на коде Борланда ! Для того исходники в scktcomp.pas и даны ! Не нравится ? Много лишнего для твоей задачи ? На здоровье ! Проанализируй и выкинь лишнее ! Добавь свое ! Но центральная логика у борланда 100%-но верна в этих компонентах, и - поверь уж - нет никакого резона изменять ее радикальным образом без осмысленной необходимости !
← →
Repeater (2002-11-12 10:23) [43]Спасибо, буду разбираться. Странная, конечно, логика. Зачем ему надобно эту структуру "держать". Пускай бы загрузил себе данные из нее в свое хранилище и "отпустил".
Я тут наткнулся на интересный примерчик
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1033251921&n=4
Сейчас с ним разбираюсь. Наверное так же сделаю.
← →
Digitman (2002-11-12 10:35) [44]
> Странная, конечно, логика. Зачем ему надобно эту структуру
> "держать".
Хотя бы за тем, что существует асинхр.режим вызова Lookup-ф-ций Winsock.
Когда ты задаешь целевой хост по имени, а не по адресу, требуется разрешение имени. Взгляни в реализацию
procedure TCustomWinSocket.CMLookupComplete(var Message: TCMLookupComplete);
станет понятно, почему так, а не иначе
← →
Repeater (2002-11-12 20:17) [45]Спасибо.
Но у меня еще вопрос. Как лучше всего проверить работает еще сокет или он уже закрыт (произошел дисконнект и т.д.)
← →
Digitman (2002-11-13 08:24) [46]О штатном дисконнекте по инициативе партнера говорит событие OnDisconnect(). Но событийная нотификация работает только в асинхр.неблок.режиме.
В блок.режиме и при нештатном обрыве трансп.петли коннекта факт дисконнекта можно определить только вызвав один из транспортных методов (например, send(), recv()) и получив при этом отказ с соотв.кодом ошибки
Страницы: 1 2 вся ветка
Текущий архив: 2003.01.13;
Скачать: CL | DM;
Память: 0.53 MB
Время: 0.01 c