Форум: "Сети";
Текущий архив: 2003.01.13;
Скачать: [xml.tar.bz2];
ВнизПередача данных при помощи сокетов. Найти похожие ветки
← →
V_Pavel (2002-11-12 12:15) [40]Вроде все так но на самом деле чтото не так. У меня вот какое предположение. Вызвали мы метод SendStream он вернул True но на самом деле физически часть пакета еще находится на сервере. И скорее всего пока они не передадутся сокет заблокирован. Если это так то отсюда вопрос как узнать передан пакет или нет.
← →
Digitman (2002-11-12 12:38) [41]
> но на самом деле физически часть пакета еще находится на
> сервере
На стороне передатчика - так будет вернее в общем случае.
А какое тебе дело до "физики" ?
Если send-метод вернул True, это уже не твоя забота, как и когда все это "физически" будет доставлено приемнику. Все ! О факте достоверной физической доставки Winsock не обязан извещать тебя. Ибо низкоуровневый IP-транспорт - механизм достаточно сложный и доставка в реалии выглядит вовсе не так, как это выглядит для прикладной программы
Если же send-метод вернул False, то это означает только одно : в данный момент Winsock не может принять данные для передачи и, как только будет свободен позднее, известит тебя об этом в событии OnWrite().
> как узнать передан пакет или нет.
Принимающая сторона при необходимости может, в свою очередь, послать подтверждение по факту приема сообщения
← →
V_Pavel (2002-11-12 13:15) [42]А каким образом Winsock известит меня что свободен и готов к следующей передаче т е как я могу отследить этот момент.
P.S. Может я конечно задаю глупые вопросы но мне очень хочется разобраться.
← →
Erik (2002-11-12 13:33) [43]Да заеяли вы обсуждение, какбудто космический корабль запускаете!
Digitman будь проще и народ к тебе потянеися :)
V_Pavel ты идеалогию измени, прописывай в каждый пакет заголовок в котором содержится размер. И использй Indy+UDP блокирующей режим невызывает трудностей при програмировании. Правда если у тебя передача вне локалтной сети то UDP следует пользоватся с осторожностью. Физический размер пакета в UDP может достигать 64К
← →
Digitman (2002-11-12 13:39) [44]Вот на то и существует событие OnWrite() !
Оно возбуждается как минимум 1 раз - сразу следом за событием OnConnect()
Кр.того, в неблок.режиме событие OnWrite() возбуждается всякий раз, когда Winsock не в состоянии в момент предыдущего обращения прикладной задачи к send-ф-ции принять к передаче указанный блок данных указанного размера.
Иными словами, если режим - неблокирующий и попытка вызова ф-ции send() вернула результатом значение SOCKET_ERROR с кодом отказа WSAGetLastError() = WSAEWOULDBLOCK (10035), то тем самым Winsock говорит : я сейчас не в состоянии принять к исполнению то, что просишь передать, я занята передачей того, что ты от меня потребовал ранее, подожди, я сообщу о готовности как только буду свободна событием FD_WRITE
← →
Digitman (2002-11-12 13:43) [45]>Erik
Вот в твоих никчемных комментариях, сударь, в данном случае я нуждаюсь меньше всего.
← →
Erik (2002-11-12 16:48) [46]Осмелюсь заметить сударь, что дополнения нетакие уж никчемные! Я сделал сервер с клиентом для сетевой работы с устройством висящем на com порту. И Indy у UDP прекрасно для этого подошол. Следовательно могу рекомендовать то, что проверил лично!
← →
Digitman (2002-11-12 17:00) [47]>Erik
Да на здоровье. Сделал и сделал. Флаг тебе в руки. Но это отнюдь не дает тебе повода для указаний, быть мне "проще" или "сложней".
Касаемо сабжа, автор хочет понять внутреннюю "кухню" гнезд Беркли, и я всего лишь стремлюсь помочь ему в этом. Уясни для себя это и комментарии свои, не относящиеся к теме, впредь выноси в отдельные ветки. Будь уж так любезен.
← →
V_Pavel (2002-11-13 08:21) [48]>Erik
Ну раз все так круто работает приведи пример приемника и передатчика пакетов.
← →
V_Pavel (2002-11-13 08:40) [49]> Digitman ©
Я тут набросал проект на основе твоих рекомендаций, может посмотришь что там не так почему он не работает как надо.
← →
Digitman (2002-11-13 08:43) [50]Бросай сюда. Лишнего не надо, только - процедуры передачи и приема
← →
V_Pavel (2002-11-13 08:55) [51]> Digitman ©
Да вот наверно лучше я тебе на мыло вышлю. т.к. процедуры приема и передачи пакетана на 99% идентичны описанным тобой.
← →
V_Pavel (2002-11-13 12:00) [52]> Digitman ©
Я послал тебе на мыло свой проект. Посмотри пожалуста почему он не работает как надо.
← →
Digitman (2002-11-13 12:18) [53]Ок, посмотрю.
P.S. Мыло-то откуда взял ? Из старых "запасов", очевидно ? Анкетка-то моя "рухнула" при последнем известном катаклизме на сайте, сам даже добраться не могу, на себя, любимого, посмотреть-полюбоваться)
← →
Erik (2002-11-13 12:33) [54]V_Pavel привожу примеры приема отправки пакетов для UDP.
В Indy есть только блокирующй режим, поэтому надо посылпть пакеты в нутри треда. Если коечно висеть не хочется.
Передача с клиента и получения подтверждения:
procedure TDecoder.SendUDP(Index: Byte);
Var PackCmd: TPackCmd;
PackConf: TPackConf;
Error, IP: String;
Size: Integer;
Begin
if GenParams(Index, IP, PackCmd) then begin
Error := "";
IdUDPClient.SendBuffer(IP, WPort, PackCmd,SizeOf(PackCmd));
try
Size := IdUDPClient.ReceiveBuffer(PackConf,SizeOf(PackConf));
if Size = SizeOf(PackConf) then begin
if PackConf.Id <> PackCmd.Id then Error := "Packet id not eiqual";
end else Error := "Not recive packet";
except
on E: Exception do Error := E.Message;
end;
end else Error := "Not gen params";
Notification(Index,PackConf, Error);
end;
Получение на сервере:
IdUDPServer := TIdUDPServer.Create(nil);
IdUDPServer.OnUDPRead := UDPServerUDPRead;
procedure TRealEvent.UDPServerUDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
begin
Size := AData.Size;
Case Size of
SizeOf(Params): AData.Read(Params, Size);
....
end;
Помоему все очень просто. И примеры для Indy просто сказка. В них возможно есть готовое решение.
← →
savva (2002-11-13 15:30) [55]> Digitman © (13.11.02 12:18)
> P.S. Мыло-то откуда взял ?
а мышку на ник свой наведи:))
← →
Digitman (2002-11-13 15:54) [56]>savva
А, ну да ...точно)... я уж и забыл)...
Любопытно вот, а какого, пардон, хрена мыло отдельно от анкетки хранится в базе ? Вот хоть убей - не пойму сей логики)... imho, дурь ... или вообще никакой сквозной логики ... или отупел я совсем)))
← →
savva (2002-11-13 16:34) [57]> Digitman © (13.11.02 15:54)
наврядли это база, скорее всего это куки - они то и подставляют твое мылов поле e-mail когда ответ пишешь.. уберешь оттуда мыло - и не будет его напротив ника - как у меня...:-)))
← →
Digitman (2002-11-13 16:49) [58]>savva
Может, и куки) ... не задумывался
А вот то, что анкетная база рухнула - это по-любому печально
← →
savva (2002-11-13 17:01) [59]она рухнуть то рухнула, но теперь все исправили, можно заново зарегистрироваться (если конечно не влом:)). я тоже бы в списке "тех кто уже не с нами", а сейчас "воскрес" Ж)
← →
Digitman (2002-11-13 17:40) [60]>savva
Да ну и хрен с ней, с анкетой ... я уж тут за пару лет "нарисовался" своими "перлами" - без всякой анкеты понятно, что говорить со мной "нормально" невозможно в принципе))))))))
Страницы: 1 2 вся ветка
Форум: "Сети";
Текущий архив: 2003.01.13;
Скачать: [xml.tar.bz2];
Память: 0.57 MB
Время: 0.011 c