![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Асинхронная передача данных в 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")
проверь теорию на практике
см. исх.тексты упомянутых компонентов