sendto большую структуру....

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

  1. ZeroMemory

    ZeroMemory New Member

    Публикаций:
    0
    Регистрация:
    9 янв 2005
    Сообщения:
    79
    Есть структура размером более 95кб. За раз - не получается ее отправить (10040 wsa error)! Как быть?



    Благодарен!
     
  2. ZeroMemory

    ZeroMemory New Member

    Публикаций:
    0
    Регистрация:
    9 янв 2005
    Сообщения:
    79
    Я так и подумал, но не знаю как это реализовать. Если можно - приведи код, плз.
     
  3. ZeroMemory

    ZeroMemory New Member

    Публикаций:
    0
    Регистрация:
    9 янв 2005
    Сообщения:
    79
    Да я определил структуру! Вот она:
    Код (Text):
    1.  
    2. typedef _tag_rem_data{
    3.  byte cmd;
    4.  char path[MAX_PATH];
    5.  char data[96*1024];
    6. } rem_data;
    7.  


    За один раз не получается отослать структуру (10040):
    Код (Text):
    1.  
    2. rem_data data;
    3. sendto(s, data, sizeof(data), 0, sin, lsin);
    4.  




    Подскажите плз как мне эту структуру разбить на части и посылать последовательно! С верверной стороны я сам все получу ок, знаю как! А тут загвоздка. Помогите плз.
     
  4. ZeroMemory

    ZeroMemory New Member

    Публикаций:
    0
    Регистрация:
    9 янв 2005
    Сообщения:
    79
    Эммм.. Спасибо кнешна, но нельзя ли на СИ это дело показать? :))



    Сорри за ламерство :)
     
  5. Paranoid333

    Paranoid333 New Member

    Публикаций:
    0
    Регистрация:
    4 май 2004
    Сообщения:
    11
    rem_data data;

    int buflen = sizeof(data);

    char *bptr = (char*)&data;

    int n;

    #define len 1024 //размер передаваемого за раз куска



    while(true){

    if(buflen >= len){

    n = send(s,bptr,len,0);

    bptr += n;

    buflen -= n;

    }

    else{

    send(s,bptr,buflen,0);

    break;

    }

    }



    Этот код мало пригоден для реального использования(проверки на ошибки напроч отсутсвуют), но сама идея должна быть понятна.



    З.Ы.: Писалось отбалды, поэтому работоспособность не гарантируется, а даже наоборот :)

    З.З.Ы.: С сишными вопросами лучше обрашайся на sources.ru, там кстати подобный вопрос всплывал нераз.
     
  6. ZeroMemory

    ZeroMemory New Member

    Публикаций:
    0
    Регистрация:
    9 янв 2005
    Сообщения:
    79
    Я вот тут подумал, посовещался с мастерами и тут нарисовался такой вопрос: если даже я распилю структуру на части то как я их словлю? Ведь передача идет по UDP протоколу который НЕ гарантирует ни очередность, ни собсна факт доставки датаграммы! Как быть, господа?
     
  7. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    ZeroMemory

    Предусмотри в каждой части место для номера части, общего количества частей и уникального идентификатора, на случай если потребуется из разных потоков посылать разные структуры порезанные на части.
     
  8. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    Ведь передача идет по UDP протоколу который НЕ гарантирует ни очередность



    Извиняюсь, может я чего не понял (в сетях не разбираюсь), но если ты работаешь на уровне send/recv, то может быть так, что данные из первой посылки by send придут раньше, чем была вторая посылка ?! Разве ниже уровнем нет протокола, который уже следит за очередностью ? А если это не так, то можно смело посылать кусками безо всяких zmodem'ов или zontalk'ов ;)
     
  9. Max

    Max Member

    Публикаций:
    0
    Регистрация:
    22 май 2003
    Сообщения:
    192
    ZeroMemory

    Есть структура размером более 95кб



    udp - это datagram-oriented протокол.

    это означает, что ты получишь ровно столько, сколько отправил (пакет не режется на части).

    максимальный размер udp-пакета возвращается при вызове WSAStartup и на винде он равен ~64Kb.



    поэтому тебе надо организовать свой протокол, который будет резать твои буфера на размеры меньше 64K, снабжать их спец. заголовком и отправлять. на приемной стороне собираешь эти пакеты до кучи.



    tcp (в отличии от udp) это stream-oriented протокол, и вот там пакет может резаться как угодно, то есть теоретически ты может отправить 10 пакетов по 100 байт, а получить 1 пакет на 1000 байт.

    а может и наоборот - отправляешь 1 пакет на 1000 байт, а получаешь 10 по 100.

    поэтому сборка/разборка пакетов на tcp несколько более сложная вещь.



    вообщем, почитай для начала литературу ;)
     
  10. OLS

    OLS New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2005
    Сообщения:
    322
    Адрес:
    Russia
    Что-то прошлая моя винда отказывалась отсылать более 9 килобайт по протоколу UDP, так что эту величину все же лучше считать параметром - никто не может сказать чему будет равно ограничение в следующей версии ОС