Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> отмена склеивания пакетов 
:(
    Опции темы
Incinerated
Дата 15.2.2009, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 18.5.2006
Где: Беларусь, Новопол оцк

Репутация: нет
Всего: нет



есть сервер и клиент
сервер посылает информацию:
Код

        bool flag = false;
        while (!flag){
          String str = WorkWithBase->GetOneQueryString(0);
          if (str != ""){
            send(my_sock,str.c_str(),str.Length(),0);
          }
          else
            flag = true;
        }

в кратце сервер коннектится к БД и вычитывает информацию... и должен послать найденные поля... допустим он нашел 3 записи, значит будет 3 цикла While, т.е. 3 раза сработает send. Если инфа была "Привет", "Как дела", "Ок"... то на принимающей стороне примется это все за раз, а не за 3 как положено, т.е. пакеты склеились в один... а мне не нужно это...
Код

    for (int i = 0; i < StrToInt(n); i++){
      bytes = recv(sTransmit,tmp,100,0);
      /*
      */
    }

вот тут срабатывает один раз и в tmp находится "ПриветКак делаОк".... что мне совсем не нужно...
что можно сделать,чтобы нормально пакеты принимались - по-одному?
P.S. количество записей я сразу посылаю... и в клиенте это хранится в переменной n
PM MAIL   Вверх
MAKCim
Дата 15.2.2009, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 6
Всего: 207



Цитата(Incinerated @  15.2.2009,  16:11 Найти цитируемый пост)
что можно сделать,чтобы нормально пакеты принимались - по-одному?

либо использовать UDP, либо использовать разделитель данных


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
kolobok0
Дата 16.3.2009, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 24.12.2008

Репутация: нет
Всего: 2



Цитата(Incinerated @ 15.2.2009,  16:11)
есть сервер и клиент...

говорить о "пакетах" при использовании TCP - мягко говоря не понимать TCP. TCP это ТРУБА по которой идёт ПОТОК данных и НИКАК ИНАЧЕ!!! В Вашем примере нет ышо куча случаев которые многие программисты просто не обрабатывают...

пример..
шлём 
1) 123456
2) абвгде
3) qwerty

то можем получить
1) 123456абв
2) гдеqwer
3) ty

надеюсь смысл Вы поняли...
Что делать..
1) либо слать стандартной длины свои данные - аля пакеты.
2) разделять данные по принципу заголовок-длина
3) разделять данные по принципу "разделитель данных".

два последних обычно и юзают в программах. Единственное "но" - забывают то, что НЕОБЯЗАТЕЛЬНО ПРИНЯТАЯ ДЛИНА равна отправленной!!! за один квант посылки...Т.е. не делают "накопитель" у приёмника - это ТИПИЧНАЯ ошибка на клиенте у многих программеров (юзают увы в тупую примеры с МСДН и иже, не нагруженного такими вещами ессесвенно).


удачи Вам
(круглый)
PM MAIL   Вверх
Comm
Дата 17.3.2009, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 269
Регистрация: 31.8.2007
Где: Санкт-Петербург

Репутация: -1
Всего: 1



Если я тебя конечно понял то... 
Код

 if (str != ""){
            конектимся 
            send(my_sock,str.c_str(),str.Length(),0);//шлем то что нужно
            тут разрываем соеденение
          }

P.S. Ну минус конечно очевиден)
Ну или
Код

bool flag = false;
String sBuff;
        while (!flag){
          String str = WorkWithBase->GetOneQueryString(0);
          if (str != ""){
             sBuff+=str+":";
          }
          else
            flag = true;
        }  
          if(!flag)send(my_sock,sBuff.c_str(),str.Length(),0);

ну и на сервере за один проход получит строку и там разделить её,разделителями является знак ":" 

sBuff.c_str()

Это сообщение отредактировал(а) Comm - 18.3.2009, 16:07


--------------------
=)))))
user posted image
PM MAIL ICQ   Вверх
kolobok0
Дата 18.3.2009, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 24.12.2008

Репутация: нет
Всего: 2



Цитата(Comm @ 17.3.2009,  16:34)
Если я тебя конечно понял то... //шлем то что нужно тут разрываем соеденение....разделителями является знак ":"

Если вопрос с примерами мне - то..
по первому примеру - нет(разрывать соединение не нуна)..по второму да...

а) стандартные длины...шлём на стороне сервака всегда по 500 байт. на стороне клиента всегда резервируем буффер в 500 байт и вынимаем первым делом длину. если она не 500 то опять ждём. если 500 - вычищаем буффер и анализ...
б) стандартной длины заголовок. в котором есть длина текущего "кванта" данных и(возможно) вспомогательная инфа - что за "хрень" собственно пришла...по коду "хрени" можем сразу выбросить данные (в случае не обработки их) - т.к. длину знаем. Если произошёл сбой - рвём соединение(не наш клиент типа)...считываем из сокета указанную длину в свой накопительный буфер. по приходу всего кванта - анализ...
в) то, что в Вашем примере...

с уважением
(круглый)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0655 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.