Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.55 MB
Время: 0.02 c
1-37092
NorthMan
2003-01-03 12:58
2003.01.13
Народ, подскажите. Чтобы на кнопочках диалогов


14-37323
Metallica
2002-12-21 18:44
2003.01.13
Где можно взять анализатор HTML-кода?


1-37131
123000
2002-12-28 13:16
2003.01.13
Plug-Ins


6-37259
Hirara
2002-11-10 00:13
2003.01.13
Про сокеты


8-37220
MadCoder
2002-09-25 15:01
2003.01.13
Вывод многоцветной картинки в DXDraw