Главная страница
    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.53 MB
Время: 0.01 c
1-37137
jen_bond
2002-12-29 12:15
2003.01.13
Перекрывание компанентов


14-37322
alextov
2002-12-21 16:57
2003.01.13
Нужны исходники примитивного http-proxy


14-37268
Ketmar
2002-12-22 15:52
2003.01.13
учимся пить %-))


14-37342
Jane
2002-12-24 13:01
2003.01.13
Защита БД


4-37471
XED
2002-11-27 00:26
2003.01.13
Блокировка мышки и клавиатуры!!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский