Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Асинхронная передача данных в Delphi по сети. Поможите кто можите [D7, Win2k, WinXP]


empty ©   (2004-05-11 12:53:00) 

Для того что бы осуществить работу с сетью в дельфях я пользуюсь компонентом TTcpServer и TTcpClient и в соответствии с этим у них есть набор параметров (свойств) среди которых есть параметр BlockMode [bmNonBlock, bmBlock, bmThreadBlock]. Вот с bmBlock всё ясно и так, а вот как работать с сокетами в режиме асинхронки? Меня интересует часть кода для организации передачи данных. Причём тема, которая сподвигла меня на решение этих проблемм - чат по локалке, но естественно с элементами отсебятины. Причём документация сильно хромает по этой теме, все кто знает что - нить по этому поводу подскажите как разобраться.


Digitman   (2004-05-11 14:56:00) [1]


> и если не знаешь ответа на вопрос я не думаю что стоит вообще
> встревать в разговор!


умерь свой чапаевский пыл
ты выбрал TTCPServer/Client, ничем свой выбор зде сь не обосновав


empty   (2004-05-11 14:45:00) [2]

Это я уже понял. В исходном коде
Коммент :

{$IFDEF LINUX}
 if BlockMode = bmThreadBlocking then
 begin
   // Hack to avoid server thread block forever in linux
   EnterCriticalSection(FThreadLock);
   try
     if Select(@ReadReady, nil, @ExceptFlag, 1000) then
       Result := ReadReady and not ExceptFlag;
   finally
     LeaveCriticalSection(FThreadLock);
   end;
 end
 else
{$ENDIF}
   if Select(@ReadReady, nil, @ExceptFlag, -1) then
     Result := ReadReady and not ExceptFlag;


присутствует дырка, тут от изменения параметров не изменяется режим установки флагов для принятия информации, порт спит и не реагирует, я даже тестил только что, но блокировка программы вызывает ошибку при несуществующем хосте и виснит всё приложение, чего естественно допускать нельзя. Я решил применить асинхронный метод, потому что по определению он является методом без блокировки потока, а полностью передаёт его в автономном режиме на порт и ип, при этом не проверяя дошёл ли пакет или нет, это удобно, и здесь отсутствует переменная TTLS (Time To Live Socket), тобиш он не умирает до этапа принудительного отмирания. А создавать треаду в ручную пользы не приносит, она также вешается, даже если варировать приоритет, при этом приложение не отдаёт код возврата и выходит только с ошибками, иначе триаду не убить. я уже почти весь модуль разобрал. С учётом того что я и админом долгое время работал в разных мстах то текст ссылок мне новым не стал, я всё это понимаю, меня сам алгоритм интересует как управлять сокетом при асинхронке. Тобиш серверная часть программы погружается в слип при этом активен остаётся только буфер который в триаде постоянно проверят наличие информации в свмом себе, после этого изменяя флаг и вызывая код обращения на себе через мессэдж в АПИ, дальше происходит чтение и передача инфы c перекодировкой из Нет_пака. У клиента всё тож очень интересно, но вот там принцип гораздо проще и просто BlockMode будет (грубо говоря) либо 1 либо 0, при этом в состоянии 0 он не будет ждать ответного сигнала от серверной части приложения. Вот я и хотел поинтересоваться как кто с этим справился и я говорю про ( Delphi 7 ) в теме можно заметить
>в Д5 нет , слава богу, никаких TTcpClient/Server
и если не знаешь ответа на вопрос я не думаю что стоит вообще встревать в разговор!
С уважением Денис.


Digitman   (2004-05-11 13:49:00) [3]

я не знаю, что в TTcpClient/Server означает bmNonBlock (в Д5 нет , слава богу, никаких TTcpClient/Server), но скорей всего как раз этот режим и реализует неблокирующий режим с асинхр.нотификациями


Digitman   (2004-05-11 13:36:00) [4]


> empty ©   (11.05.04 13:29) [8]


> как бы у меня уже есть диплом с отлич аем по математическому
> программированию


это заметно

тебе дана ссылка на русскоязычный ресурс по теории гнезд, вокруг которой вертится вся та "практика", что фигурирует в исх.текстах и этих и прочих аналогичных компонентов... что непонятно ? говори конкретно ... иначе кроме как детским садом ("мне все понятно, но мне ничего не понятно") это не пахнет


empty   (2004-05-11 13:29:00) [5]

Я наверное неправильно разъяснился, но как бы у меня уже есть диплом с отличаем по математическому программированию и по тематике дискретной математике и т.д. Также я работал на целой толпе линуксовых серверов Баз данных, и документации по этим вопросам у меня предостаточно, но вот когда я решил заняться сокетами, у меня возникли проблемы, которые я уже два дня решить не могу. Необходима быстрая помощь, а ознокомление с документации - это занятие долгое и чаще всего не продуктивное, потому что документацию не научились разрабатывать на уровне понимания! (моё мнение, можете не согласиться). И всётаки если есть желание мне объяснить а не поумничать на эти темы, то будьте людьми помогите. Тема для меня новенькая. А я ещё чем помогу если надо.


Digitman   (2004-05-11 13:28:00) [6]


> до меня туго доходит


сожалею


> ответы типа ссылок на литературу не считаются ответами


мы тут что, в детский сад играем ? "считается - не считается ?"


> вроде понятно, но принципа я не пойму


принцип везде один и тот же - последовательное выполнение операторов программы


Polevi   (2004-05-11 13:23:00) [7]

>документация до меня туго доходит
мало стараешься либо брось это занятие, займись делом где не надо читать документацию - грузить чего-нибудь к примеру или овощи собирать


empty   (2004-05-11 13:17:00) [8]

Нет :) Там (в модулях), вроде понятно, но принципа я не пойму, а документация до меня туго доходит, вот я и пытался выцепить конкретный ответ.... Просто ответы типа ссылок на литературу не считаются ответами... Ты уж извини.


Digitman   (2004-05-11 13:11:00) [9]


> там разобраться толко не представляется возможным


там что, по-китайски написано ?


empty   (2004-05-11 13:10:00) [10]

Тогда для полного нагруза я добавлю ещё вопросов.
Вопрос намбр ван) Как отморозить этот драный TcpClient при попытки коннекта к несуществующему хосту?
Вопрос намбр ту) Как вообще узнать, является ли хост реальным или его в сети нет? (желательно элементами кода)

спасибо.


empty   (2004-05-11 13:02:00) [11]

Не, спасибо конечно, но я посмотрел исходники, а в связи с тем что там разобраться толко не представляется возможным, я бы хотел увидеть какое-нибудь внятное обоснование этим свойствам, просто для меня сам принцип принятия и отправки информации остаётся тёмным. Заранее спасибо.


Digitman   (2004-05-11 12:58:00) [12]


> empty


начни с теории

см. http:/book.itep.ru (разделы "Протокол TCP" и "Winsock")

проверь теорию на практике

см. исх.тексты упомянутых компонентов


Наверх

Титульная страница Поиск, карта сайта Написать письмо