Главная страница
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.018 c
7-37407
Slatazan
2002-11-02 03:57
2003.01.13
string to bytes


3-36951
Yurik
2002-12-18 13:29
2003.01.13
Добрый день уважаемые мастера!


14-37276
dmk
2002-12-20 23:13
2003.01.13
Хочу учиться !!!!!!!!!!!!!!!!!!!


7-37410
alex134
2002-11-03 01:29
2003.01.13
Вопрос для шарящих (работа с адресным пространством)


14-37338
AL2002
2002-12-16 14:01
2003.01.13
Где будем Новый год встречать?