Конференция "Сети" » Send быстрее Recv. Что происходит?
 
  • vlk32 (28.01.13 18:52) [0]
    Я использую WinSock 2 (в качестве протокола - TCP) для обмена данными между клиентом и сервером. Первый тест начал делать на одной машине и заметил такую штуку. Клиент максимально быстро формирует небольшие пакеты (14 байт) общим числом 10000 и отправляет их на сервер

    procedure TClientForm.ButLoadTestClick(Sender:TObject);
     var a : TStockAction;
         i,j,k : Int32;
     begin
      //
      Randomize;
      for j:=0 to 4 do
       begin
        for i:=1 to 2000 do if cli<>Nil then
         begin
          if Random<0.5 then a.AType := doASK else a.AType := doBID;
          k := 1+Random(5);
          a.StockName  := StockName[k];
          a.StockCount := j*2000+i;
          a.StockPrice := StockPrice[k]+Random(20);
          cli.Action(a);
         end;
        //Sleep(10);
       end;
     end;



    Если задержка используется то сервер принимает данные в полном объеме даже при относительно небольшом буфере для приема данных. Если задержка убрана, то все зависит от размера буфера на сервере. Если буфер больше чем общий объем отсылаемых данных то все принимается на ура. В противном случае принимается объем данных несколько больший чем размер буфера. Я использую неблокирующее чтение/запись и порты завершения для обработки событий ввода/вывода.

    Правильно ли я понимаю, что в случае, если клиент отправляет данные (WSASend) быстрее чем сервер успевает их читать с помощью WSARecv (и обрабатывать) то избыток поступающих данных просто теряется?

    Видимо это связано с ограничениями системного буфера куда первоначально попадают данные пришедшие на сокет. Можно ли как то настроить размер этого буфера (если он конечно существует) таким образом, чтобы система удерживала какой то фиксированный объем данных поступающих от клиента до того как они будут затребованы вызовом WSARecv?
  • Rouse_ © (28.01.13 18:57) [1]

    > Правильно ли я понимаю, что в случае, если клиент отправляет
    > данные (WSASend) быстрее чем сервер успевает их читать с
    > помощью WSARecv (и обрабатывать) то избыток поступающих
    > данных просто теряется?

    Если теряется? то ты получишь ошибку, TCP для того и нужен чтобы гарантированно доставить данные, в отличие от UDP
  • vlk32 (28.01.13 19:08) [2]
    Э как бы в данном случае они в пункт назначения приходят (т.е. в сети никаких потерь нет), но сервер их не успевает вычитывать. И по поведению проги такое ощущение что если входной буфер сокета (системный) забит то вновь пришедшие по сети данные игнорируются.
  • Rouse_ © (28.01.13 20:08) [3]
    ты уж определись кто у тебя сервер, тот который говорит что они приходят, или тот, который имеет на руках все полченные данные?
  • Сергей М. © (28.01.13 21:41) [4]

    > Правильно ли я понимаю, что в случае, если клиент отправляет
    > данные (WSASend) быстрее чем сервер успевает их читать с
    > помощью WSARecv (и обрабатывать) то избыток поступающих
    > данных просто теряется?


    Неправильно.
  • vlk32 (28.01.13 21:49) [5]
    Njulf
    > Неправильно.


    Ну а что же на само деле происходит? Данные из сети получены. Куда их система девает если сервер их не требует, т.е. не вызывает recv?
  • Сергей М. © (28.01.13 21:52) [6]

    > Куда их система девает


    А тебя это так заботит ?
    Твое дело - правильно и вовремя выгребать данные из входящего потока.
  • vlk32 (28.01.13 22:44) [7]

    >
    > А тебя это так заботит ?
    > Твое дело - правильно и вовремя выгребать данные из входящего
    > потока.


    Вроде разобрался. Получается если на принимающей машине забит входной буфер то на клиентской стороне начитают лезть ошибки при очередном вызове send
  • Дядя (30.01.13 11:20) [8]

    > Получается если на принимающей машине забит входной буфер
    > то на клиентской стороне начитают лезть ошибки при очередном
    > вызове send

    Не получается. Неблокирующий send вернёт ошибку, когда на передающей стороне переполнится буфер передачи драйвера. А случиться это может по разным причинам, в том числе и потому, что принимающая сторона откажется принимать очередной пакет из-за того, что переполнился её буфер. Это нормальная ситуация, надо просто правильно реагировать.
 
Конференция "Сети" » Send быстрее Recv. Что происходит?
Есть новые Нет новых   [118683   +11][b:0][p:0.001]