Форум: "Сети";
Текущий архив: 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