Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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
6-37238
Mr. Moon
2002-11-12 14:57
2003.01.13
Сообщение по новелу


1-37208
maxim2
2002-12-31 09:18
2003.01.13
Undeclared identifier VarToStr что за ошибка ???


3-36995
Filat
2002-12-19 10:29
2003.01.13
В D6 не работает dsEdit, dsInsert. Неизвестный идентификатор?


1-37134
jen_bond
2002-12-29 09:51
2003.01.13
Узнать номер компанента


14-37327
Слава
2002-12-23 21:10
2003.01.13
Мастера! Помогите!





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