Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.11.05;
Скачать: CL | DM;

Вниз

Accept, блокировка   Найти похожие ветки 

 
KirillSKTS ©   (2006-06-15 10:34) [0]

Есть сервис в котором создается отдельный поток для приема по ТСР соединению команд и ответа на них. Почему не ТServerSocket? размер - 350 против 95кБ. Так все нормалтьно работает за исключением следующего. Из основного потока сбрасывается флаг и этот поток должен закончиться. Но функция Accept блокирующая. И в результате поток глохнет с концами в ее дебрях, следовательно я просто по тайм ауту прибиваю поток.  
Или я что то неправильно делаю или КАК вытащить принудительно поток из Accept с любым кодом завершения. Хоть как ни будь можно сделать это? используется, может и не оптимально, WinSock 1.1.

вот код:

begin
........
 if not InitWSA then exit;

 if CreateNewBaseSocket then
 try
  while FlagServiceRun do  // крутимся в цикле и ждем окончания
   begin
    i:=SizeOf(NewSocAddr);
    NewNetSoc := accept(NetSoc, @NewSocAddr, @i);
    if NewNetSoc<>INVALID_SOCKET
         then CreateNewConnect(NewNetSoc, NewSocAddr)
         else case WSAGetLastError of
               ....................
              end;
   end;
  finally
   CloseSocketMesage(NetSoc);
   CloseWSA;
  end;
end;


 
Сергей М. ©   (2006-06-15 11:09) [1]


> Почему не ТServerSocket? размер - 350 против 95кБ


Переходи на Д7 - будет 95кб.

В Д7 компоненты TClient/ServerSocket не используют юнит Forms, как раз и вносящий львиную долю тех самых ненужных килобайтов в результирующий код.


> функция Accept блокирующая


Вовсе не обязательно. Это зависит от выбранного режима работы слушающего гнезда. Если установить НЕблокирующий режим (см. ф-ции WSAAsyncSelect/WSAEventSelect/ioctlsocket) ф-ция Accept() сразу же вернет управление.

Если по тем или иным причинам блокирующий режим гнезда не м.б. задействован или не желателен, можно поступить иначе - выполнить CloseSocket(ListeningSocketHandle) в любом другом кодовом потоке. При этом ф-ция Accept() тут же вернет управление с соответствующим кодом ошибки.


 
Сергей М. ©   (2006-06-15 11:46) [2]

Все тоже самое, кстати, касается любой другой ф-ции (например, send, recv), предполагающей работу в обоих режимах.


 
KirillSKTS ©   (2006-06-15 13:55) [3]

А если использовать функцию Select? еще не смотрел но вычитал на просторах инета что она тоже блокирующая но на заданный промежуток времени. Меня бы устроило погружение на 10-200мс и возвращение к жизни.


 
Сергей М. ©   (2006-06-15 14:01) [4]

Select не имеет отношения к логике акцепта - эта ф-ция предназначена для работы с уже установленными соединениями.


 
KirillSKTS ©   (2006-06-15 14:16) [5]

Для неблокирующего режима надо окно создавать... незнаю, в сервисе безоконном буферное окно только для приема сообщений создавать - как то не смотрица... В принципе все  и так работает :) даже замечательно, но дужу грызет ...


 
Сергей М. ©   (2006-06-15 14:20) [6]


> Для неблокирующего режима надо окно создавать


Чавой-то ?

Эт где такая глупость прописана ? Покажи ...


 
KirillSKTS ©   (2006-06-15 16:39) [7]

Тогда я чегой то не понял:
Асинхронный режим - это когда посылаются сообщения о событиях тому что може тпринять и обработать - в данном случае это окно с его оконной функцией...

Из хэлпа:
The Windows Sockets WSAAsyncSelect function requests Windows message-based notification of network events for a socket.

int WSAAsyncSelect (

   SOCKET s,
   HWND hWnd,
   unsigned int wMsg,
   long lEvent
  );


 
Сергей М. ©   (2006-06-15 16:56) [8]

"Асинхронный" и "неблокирующий" - далеко не синонимы.

Неблокирующий режим подразумевает синхронность или асинхронность.

Асинхронность подразумевает алгоритм, базирующийся на событиях.

Событием может являться получение оконного сообщения (WSAAsyncSelect) и сигнал ивента (WSAEventSelect). Последнее не имеет никакого отношения к окнам.


 
Сергей М. ©   (2006-06-15 17:00) [9]


> Неблокирующий режим подразумевает синхронность или асинхронность.


Это я сморозил.

Следует читать :

Асинхронность подразумевает неблокирующий режим.


 
KirillSKTS ©   (2006-06-15 18:36) [10]

Вообщем я понял так - accept это как заваренный люк танка  - глухой номер его в WS1.1 вытащить оттуда принудительно не закрыв сокет. Во второй реализации WS2 есть возможность использовать колл-бак функцию и соответственно что то предпринимать. Тут же, в WS1.1,  приходится грохать поток в котором крутится тот ассепт. Или создавать "технологическое окно" для общения с функциями WS1.1 в асинхронном режиме. Но это порождение Винь 3.1 и иже с ним. Аминь.
Но с другой стороны это не так уж и плохо - создал поток, он как вещь в себе тихонько крутится - порождает помаленьку потоки с подключившимися, или как в моем случае он же и работает с клиентами (это управление и тут двух командиров быть не может в принципе, так что свои выгоды поимели), а опосля тихонько прибиваем поток вместе из внешней функции. Проверил в деле - пока что никаких эксцессов нет от того что я его насильно, не закрывая главный сокет, прибиваю.
Хотя идея с закрытием внешним сокета мне понравилась.


 
Verg ©   (2006-06-15 22:39) [11]


> Сергей М. ©   (15.06.06 14:01) [4]
> Select не имеет отношения к логике акцепта - эта ф-ция предназначена
> для работы с уже установленными соединениями.


Вы неправы, или неверно высказываетесь. К логике accept в чистом виде имеет, на самом деле, только КА TCP протокола. Но...

select - ф-ция обеспечивающая мультиплексный (-ксируемый) в/выв. Она так же использется для ожидания результатов установления соединения (в т.ч. и для accept-ируемых), как и для результатов/фактов передачи данных.
Применяется как для блок. режимаов, так и для неблок. режимов. Так или иначе, все асинхронные режиы winsock ( Async или Event select) используют мультиплексность + доп. к. поток для создания сеих "замечательных" св-тв winsock асинхронных сокетов.


 
Сергей М. ©   (2006-06-16 08:45) [12]


> Verg ©   (15.06.06 22:39) [11]


Согласен, я был неправ.

Цитата из справки  к select() :

The parameter readfds identifies those sockets which are to be checked for readability. If the socket is currently listening, it will be marked as readable if an incoming connection request has been received, so that an accept is guaranteed to complete without blocking


 
Сергей М. ©   (2006-06-16 08:54) [13]


> KirillSKTS ©   (15.06.06 18:36) [10]


[11] + [12] дает простое решение.

Тело акцептирующего цикла (в псевдокоде)

if select(hListeningSocket, @readfds, nil, sometimeout) > 0 then
  begin
    hNewSocket = Accept(..);
    ...
  end;


 
KirillSKTS ©   (2006-06-16 11:05) [14]

Я знал - счастье где то рядом :)


 
Сергей М. ©   (2006-06-16 11:17) [15]


> Во второй реализации WS2 есть возможность использовать колл-
> бак функцию и соответственно что то предпринимать. Тут же,
>  в WS1.1,  приходится грохать поток в котором крутится тот
> ассепт


Не надо ничего "грохать". Нужно просто задействовать неблок.режим. Он доступен для использования и в WS1.x и в WS2.x.


> Или создавать "технологическое окно" для общения с функциями
> WS1.1 в асинхронном режиме


WSAEventSelect() задействует неблок. режим с нотификациями посредством event-объектов. Никакие технол.окна при этом не требуются.



Страницы: 1 вся ветка

Текущий архив: 2006.11.05;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.04 c
2-1161063939
svt
2006-10-17 09:45
2006.11.05
Мастера, подскажите как сделать так, чтобы


15-1161243592
Плохиш
2006-10-19 11:39
2006.11.05
Растаможить новую машину в Украине стоит больше 6000 Евро?


15-1161323122
ZeroDivide
2006-10-20 09:45
2006.11.05
Где то в доме течет труба... затапливает потолок... :(


15-1161017509
Александр Иванов
2006-10-16 20:51
2006.11.05
А у нас еще практикуется такое...


15-1161180360
IMHO
2006-10-18 18:06
2006.11.05
Ну-ка, от винта!





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский