Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.03.2011, 15:51
abbat abbat вне форума
Прохожий
 
Регистрация: 08.03.2011
Сообщения: 1
Репутация: 10
По умолчанию Indy - проблемы с подтверждением доставки

Добрый день! Как известно, протокол tcp обеспечивает гарантированную доставку пакетов благодаря посылке ответных пакетов с флагом ACK. Однако, в indy возникает следующая ситуация:

Код:
TCPClient.Connect;
TCPClient.Socket.SendBufferSize:=1000;
TCPClient.Socket.RecvBufferSize:=1000;
 for i := 0 to 100 do
 begin
 strm.SetSize(1000+i);
 strm.Position:=0;
 TCPClient.Socket.BeginWork(wmWrite, strm.Size);
 TCPClient.Socket.Write(strm,strm.Size,true);
 memo1.lines.add('send '+IntToStr(strm.Size));
 Application.ProcessMessages;
 TCPClient.Socket.EndWork(wmWrite);
 end;     
TCPClient.DisConnect;

такой клиент, например, посылает 20 пакетов в секунду. А такой сервер:
Код:
procedure TForm2.TCPServerExecute(AContext: TIdContext);
begin
 strm:= tmemorystream.Create;
 AContext.Connection.Socket.RecvBufferSize:=1000;
 AContext.Connection.Socket.SendBufferSize:=1000;
 for i := 0 to 100 do
 begin
 strm.SetSize(0);

 AContext.Connection.Socket.BeginWork(wmRead,0);
 sleep(100);
 AContext.Connection.Socket.ReadStream(strm, -1, false);
 memo1.lines.add('receive '+IntToStr(strm.Size));
 Application.ProcessMessages;
 AContext.Connection.Socket.EndWork(wmRead);
 end;
 strm.Free;
end;
принимает всего 10 пакетов в секунду. Остальные, вероятнее всего буфферизуются где-то, несмотря на четко указаный буфер размером в 1 пакет.

Отсюда вопрос: как сделать так, чтобы следующий пакет не отсылался до тех пор, пока не будет хотя бы обработан функцией ReadStream (про дальнейшую обработку я уже молчу)???

На данный момент я реализую это обратным пакетом - но это черезчур нагружает сеть. Да и получается эмуляцией ACK на прикладном уровне...

PS: я пробовал работать с транзакциями, пытался сделать Socket.WriteBufferOpen и Socket.WriteBufferClose до и после записи в сокет, но все впустую. Видно, что пакет уходит в сеть сразу в момент Write. Но и сразу же приходит ACK-пакет, а обрабатывается этот пакет много позднее.
Ответить с цитированием
  #2  
Старый 11.03.2011, 17:29
Rat Rat вне форума
Активный
 
Регистрация: 12.09.2008
Сообщения: 391
Репутация: 6078
По умолчанию

Я думаю что буферизируется он на уровне сетевухи или самой оси.
Покрайней мере в ооочень старых сетевухах такая настройка была.

Может тут чем помогут: http://www.securitylab.ru/analytics/243414.php

Некогда пока глубже копнуть. Дома посмотрю.
Ответить с цитированием
  #3  
Старый 11.03.2011, 20:46
mss mss вне форума
Новичок
 
Регистрация: 29.10.2010
Сообщения: 50
Репутация: 10
По умолчанию

> реализую это обратным пакетом - но это черезчур нагружает сеть

Ни у кого не нагружает, а у тебя, видите ли, нагружает)

Прикладное квитирование доставки - ЕДИНСТВЕННЫЙ возможный способ реализовать то о чем ты ведешь речь.
Ответить с цитированием
  #4  
Старый 13.03.2011, 12:20
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

вообще-то:
Цитата:
...подтверждение другой стороной, что TCP пакеты приняты не гарантирует, что они приняты приложением...
так что единственным (имхо) способом оповещения обработки пакета принимающей стороной является расширение протокола, т.е. отправка подтверждающего пакета.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:58.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter