Отправка большого блока данных и фрагментация при приеме.

Тема в разделе "WASM.NETWORKS", создана пользователем Fallout, 19 май 2005.

  1. Fallout

    Fallout New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2004
    Сообщения:
    94
    Адрес:
    Russia
    Итого опишу задачу:



    Сервер посылает блок данных большой, разом, одним куском. Клиент при приеме почему то получает эти данные кусками, хотя сервер ничего не режет а посылает одним блоком. Для правильной обработки данных Клиентом ему надо получить весь блок данных, а потом обработать. Вопрос... каким образом можно определить сколько данных надо принять и надо ли их дальше принимать если сервер послал целый пакет а клиент принимает его кусками... Таким пакетов может быть много так что надо как то определить это всё куски одно и того же пакета или это новый пакет.



    Сокеты блокирующие принимаю функцией recv... отправка просто send
     
  2. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    сделайте маркер начала/конца пакета, и можете указать в нем

    размер пакета.

    лучше слать пакеты малого размера.



    если Вы отправите через сокет файл, скажем, в 100 Кб, то тому, кому Вы посылали этот блок, придет несколько блоков с размерами, которые зависят от трафика и загруженности линии. Причем, размеры не обязательно будут одинаковыми. Отсюда следует, что для того, чтобы принять файл или любые другие данные большого размера, Вам следует принимать блоки данных, а затем объединять их в одно целое (и сохранять, например, в файл).
     
  3. Fallout

    Fallout New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2004
    Сообщения:
    94
    Адрес:
    Russia
    Да это логично, только это невозможно... то бишь сервер переделывать нельзя... Вот я и хотел узнать... реально ли как нибудь собрать пакет зная что кусок это его продолжение а не новый... ведь send шлет конкретную длинну... и я как то думал что это дело тсп/ип вообще собирать пакеты +) есть идеи?
     
  4. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    на языках высокого уровня этот вопрос решается с помощью

    send stream
     
  5. Fallout

    Fallout New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2004
    Сообщения:
    94
    Адрес:
    Russia
    2slow

    Да нильзя ничего с сервером делать нельзя там используеться обычный send и всё...



    2A_Must_Loll

    Знаю его отлично и досканально... и соотсвенно определяю когда надо ещё принять информацию но иногда бывают коллизии когда НЕВОЗМОЖНО понять конец это или нет.... то бишь ты понимаешь что конец пакета и ждешь новый а на самом деле он просто не хорошо "порвался"
     
  6. SnugForce

    SnugForce New Member

    Публикаций:
    0
    Регистрация:
    2 май 2005
    Сообщения:
    373
    Адрес:
    Из домУ
    Хм я это прекрасно реализовал :) на delphi в начала надо добавить 4 байта на размер пакета(они зарезервированы), а ни приемной стороне ждать этих 4 байт и потом уже точно знаешь сколько придет в этом пакете. Т.е. что-то вроде своего потокола. Если хотите исходники на delphi то качаем с форума http://callipso.15ru.net в разделе Сервер. Там это все есть + расширенный протокол.