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

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.013 c
1-37194
DJ_Sedoy
2002-12-28 00:28
2003.01.13
Обработчик событий


1-37182
TCrash
2002-12-30 12:59
2003.01.13
Подсветка синтаксиса


14-37354
J_S
2002-12-24 12:58
2003.01.13
dbExpress


4-37472
Unknown user
2002-11-26 19:57
2003.01.13
Масштабирование текста


14-37330
Дмитрий К.К.
2002-12-24 06:18
2003.01.13
Именинники 24 декабря