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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Переполнение буфера модема, file transfering over ppp 
:(
    Опции темы
Orthenner
Дата 11.7.2006, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
*


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

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



Доброго времени суток.
Бьюсь над вопросом, никак не могу получить ответ.
Задача следующая. Есть два радиомодема. Подключаются к rs-232 порту. Канал прозрачный.
Пробрасываю следующими командами ppp соединение:

Код

pppd /dev/ttyS0 38400 crtscts modem debug novj noaccomp nobsdcomp noccp nopcomp novjccomp silent
pppd /dev/ttyS2 38400 crtscts modem debug novj noaccomp nobsdcomp noccp nopcomp novjccomp 


Соединение поднимается без проблем, пакетики исправно ходят.
Была поставлена задача - написать программу, которая через UDP отсылала бы по этому каналу файл с данными с регулируемым размером пакета и засекала бы время прихода каждого пакета. Программу написал, на ethernet все работает, однако при пересылке файла по радиоканалу, программа быстро забивает буфер самого модема (1 КБ). На удаленную машину приходит не более 2 КБ данных. Пробовал ограничивать размер буффера на сокет, однако меньше 2КБ мне поставить не удалось... При этом ситуация улучшилась но ненамного... 

В связи с этим появляются вопросы:
Как поставить буффер на сокет меньше 2КБ?
Как можно заставить sendto ждать до тех пор, пока не будет отправлен предыдущий пакет?
Что еще можно попробовать в данной ситуации?

Вот пара функций клиента:

Код

int client_create()
{
// Client creating
    sock=socket(AF_INET, SOCK_DGRAM, 0);
    if(sock==-1)
    {
        fprintf(stderr, "%d ", errno);
         perror("socket()");
         return -1;
    }

    int sndbuf;
    int optlen=sizeof(sndbuf);
    getsockopt(sock,SOL_SOCKET,SO_SNDBUF,&sndbuf,(socklen_t*) &optlen);

    saddr.sin_family=AF_INET;
    saddr.sin_port=htons(port);
    saddr.sin_addr.s_addr=inet_addr(ip);

    printf("Client Created, default buffer is %d\n",sndbuf);

    sndbuf=0;
    optlen=sizeof(sndbuf);
    setsockopt(sock,SOL_SOCKET,SO_SNDBUF,&sndbuf,optlen);

    getsockopt(sock,SOL_SOCKET,SO_SNDBUF,&sndbuf,(socklen_t*) &optlen);
    printf("Buffer changed on %d\n",sndbuf);

// Connecting
    connect(sock,(struct sockaddr *)&saddr, sizeof(saddr));

// Opening file
    tfile=open(filename,O_RDONLY);
    perror("open()");
    if(tfile<=0)
        return -1;
    return 0;
}

int client_transfer()
{
// Definitions
    int count=0;
    int num_read, num_send;
    int all_send=0;
// Start sent
    num_send=send(sock,START,sizeof(START),0);
    if(num_send<=0)    perror("num_send()");
    gettimeofday(&tv, NULL);
    ptm=localtime(&tv.tv_sec);
    strftime(time_string,sizeof(time_string), "%H:%M:%S", ptm);
    printf("Start sent, size %d Time: %s.%06ld\n",num_send,time_string,tv.tv_usec);
// Read first data
    num_read=read(tfile,buf, buf_len);
// While we have data...
    while(num_read>0)
    {
        if(num_read<=0)    perror("read()");
        num_send=send(sock,buf,num_read,0);
        count++;
        all_send+=num_send;
        if(num_send<=0)    perror("sendto()");
        gettimeofday(&tv, NULL);
        ptm=localtime(&tv.tv_sec);
        strftime(time_string,sizeof(time_string), "%H:%M:%S", ptm);
        printf("Packet #%d sent, size %d Time: %s.%06ld\n",count,num_send,time_string,tv.tv_usec);
        num_read=read(tfile,buf, buf_len);
    }
// Stop sent
    num_send=send(sock,STOP,sizeof(STOP),0);
    if(num_send<=0)    perror("sendto()");
    gettimeofday(&tv, NULL);
    ptm=localtime(&tv.tv_sec);
    strftime(time_string,sizeof(time_string), "%H:%M:%S", ptm);
    printf("Stop sent, size %d Time: %s.%06ld\n",num_send,time_string,tv.tv_usec);
    printf("Packets: %ld, full size: %ld\n",count,all_send);
    return 0;
}
 
 

Это сообщение отредактировал(а) Orthenner - 11.7.2006, 16:26
PM MAIL ICQ   Вверх
GrayCardinal
Дата 11.7.2006, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

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



По RFC сервер UDP'шку может вообще выбросить. В данном случае, ИМХО, буфер уменьшать не надо, Наоборот увеличить (или не трогать). Пусть система их копит.

При использовании UDP проблема узкого канала должна решаться на уровне приложения. Т.е. Повтор передачи, подтверждение, etc на уровне программы. 

Конкретно сюда можно попробовать для начала прогнать цикл :
1. Посылка удп.
2. Прием удп, посылка подтверждения.
И засечь время, из которого уже и рассчитывать время передачи (временные задержки придется ставить вручную). 

На практике UDP сервер обычно подтверждает получение каждой UDP-датаграммы от клиента. 


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


Любитель
*


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

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



Проблема решена...
Дело было в настройках модема. При исключении контроля соответствия скорости RS-232 и радиоканала из необходимых параметров неактивности линии CTS все заработало...
RTSCTS не включался.....
 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

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


 




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


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

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