Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2006.11.05;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.057 c
1-1159414736
apic
2006-09-28 07:38
2006.11.05
Работа с Edit


15-1160848995
Kolan
2006-10-14 22:03
2006.11.05
Сижу, разговаривю по ICQ с отцом. Он в соседней комнате :)


8-1143367101
sofi
2006-03-26 13:58
2006.11.05
анимация в delphi


3-1157968378
Neo Trinitron
2006-09-11 13:52
2006.11.05
MS Jet 4 и вложенные транзакции


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