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

Вниз

Асинхронная передача данных в Delphi по сети. Поможите кто можите   Найти похожие ветки 

 
empty ©   (2004-05-11 12:53) [0]

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


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


> empty


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

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

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

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


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

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


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

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

спасибо.


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


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


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


 
empty ©   (2004-05-11 13:17) [5]

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


 
Polevi ©   (2004-05-11 13:23) [6]

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


 
Digitman ©   (2004-05-11 13:28) [7]


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


сожалею


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


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


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


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


 
empty ©   (2004-05-11 13:29) [8]

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


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


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


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


это заметно

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


 
Digitman ©   (2004-05-11 13:49) [10]

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


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

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

{$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 14:56) [12]


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


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



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

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

Наверх




Память: 0.5 MB
Время: 0.045 c
1-1087888025
koala
2004-06-22 11:07
2004.07.04
[Fatal Error] Internal error: L2498


1-1087805402
Denis_Visma
2004-06-21 12:10
2004.07.04
Прогресс Бар в СтатусБар


8-1082147527
temp
2004-04-17 00:32
2004.07.04
Трёхмерная модель цилиндра


3-1086164001
nik
2004-06-02 12:13
2004.07.04
Работа с базой данный Access


14-1087287490
Vlad Oshin
2004-06-15 12:18
2004.07.04
Как конролируется работа спамера (заказчиком/посредником)?