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

Вниз

Асинхронная передача данных в 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.045 c
3-1086686609
Lony
2004-06-08 13:23
2004.07.04
mySql...


8-1082526206
Aragon
2004-04-21 09:43
2004.07.04
Как проиграть формат Midi (mid) с помощью API.


1-1087742551
Zema
2004-06-20 18:42
2004.07.04
Подскажите Мастера, как симмитировать нажатие клавиши...


3-1086782943
Dark Elf
2004-06-09 16:09
2004.07.04
Получение значения ячейки DBGrid


1-1087309389
3S
2004-06-15 18:23
2004.07.04
Поверх всех окон





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