The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Sockets:проблема с буффером"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Sockets:проблема с буффером"  
Сообщение от Gor email(ok) on 27-Мрт-07, 15:40 
Всем доброго дня суток!

Некоторое время назад я задавал здесь вопрос относительно проблем с буффером:
https://www.opennet.ru/openforum/vsluhforumID9/6096.html

Недавно я вернулся к этой программе и хотел добавить штамп сервера при получении сообщения с клиента. Проблема: в первых нескольких сотнях штемпелей происходит следующая ошибка:

Own Time    Message Number    Find Time
12:50:17.489863        1    12:50:17.454216
    2    12:50:17.456216
    3    12:50:17.456915
    4    12:50:17.457540
    5    12:50:17.458140
    6    12:50:17.458759
    7    12:50:17.459398
    8    12:50:17.459988
    9    12:50:17.460621
    10    12:50:17.461203
    11    12:50:17.461852
    12    12:50:17.462485
    13    12:50:17.463084
    14    12:50:17.490240    12:50:17.463704
    15    12:50:17.464311
12:50:17.491031        16    12:50:17.464819
    17    12:50:17.465117
    18    12:50:17.465380

Затем начинают приходить чёткие строки, но с ошибкой времени из за буфферизации(полагаю).

12:50:17.560627        360    12:50:17.560940
12:50:17.561645        361    12:50:17.561958
12:50:17.562664        362    12:50:17.562971
12:50:17.563677        363    12:50:17.563985
12:50:17.564690        364    12:50:17.565004
12:50:17.565779        365    12:50:17.566096
(здесь видно, что время прихода меньше времени отсылки)

Подскажите пожалуйста в чём заключается ошибка и как от неё избавиться.
полагаю для этого необходимо настроить буффер клиента на отсылку и буффер сервера на приём каждый раз лишь одной строчки. Я прав?


сервер:

gettimeofday( &tv, 0 );
actual_time = localtime( &(tv.tv_sec ) );
strftime( puffer, 17, "%H:%M:%S", localtime( &(tv.tv_sec ) ) );

length = recv(client_fd, buffer, sizeof(buffer)-1, 0);
if (length == 0)
   {
     printf("Connection closed by remote host.\n");
     break;
   }
buffer[length]='\0';
fprintf(log_file,"%s.%ld\t%s",puffer,tv.tv_usec,buffer);


клиент:
for(i=1; i<=10000;i++)
        {
          gettimeofday( &tv, 0 );
          actual_time = localtime( &(tv.tv_sec ) );
          strftime(vorbuffer,9, "%H:%M:%S", localtime( &(tv.tv_sec ) ) );
        
          sprintf(buffer,"\t%d\t%s.ld\n\0",i,vorbuffer, tv.tv_usec);
          length = strlen(buffer);
          send(sock_fd, buffer, length, 0);
        }

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "Sockets:проблема с буффером"  
Сообщение от vic (??) on 27-Мрт-07, 17:06 

>Подскажите пожалуйста в чём заключается ошибка и как от неё избавиться.
>полагаю для этого необходимо настроить буффер клиента на отсылку и буффер сервера
>на приём каждый раз лишь одной строчки. Я прав?

TCP? ну дык он потоковый т.е. если отправляешь 10 байт, то принимающая сторона может принять все 10 байт сразу, а может частями.. может по одному байт принимать.. т.е. необходимо проверять сколько пришло байт и довычитывать до нужной длины.

> gettimeofday( &tv, 0 );
> actual_time = localtime( &(tv.tv_sec ) );
> strftime( puffer, 17, "%H:%M:%S", localtime( &(tv.tv_sec ) ) );

сделай функцию которая возвращает готовую строку, а то копи-паст плодишь.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Sockets:проблема с буффером"  
Сообщение от Gor email(ok) on 28-Мрт-07, 17:40 
>TCP? ну дык он потоковый т.е. если отправляешь 10 байт, то принимающая
>сторона может принять все 10 байт сразу, а может частями.. может
>по одному байт принимать.. т.е. необходимо проверять сколько пришло байт и
>довычитывать до нужной длины.

Задача программы,- получать время с одной машины, записывать его в документ и дописывать в той же строчке актуальное собственное время на момент прихода вышеназванного с другой машины. Коммуникация должна при этом осуществляться с помощью TCP/IP.

Сохранять строки как положено мне удалось без проблем,- подобрал правильную величину буффера выдачи. Но при рассмотрении штемпелей видно, что момент прибытия сообщения произошёл раньше, чем оно было отослано.:)

Полагаю из за буфферизации при приходе и/или отсылке сообщений получаемый штамп времени не соответствует действительности.

В литературе нашёл сейчас Опции: SO_RCVBUF и SO_SNDBUF. Но, как я понял, буфферизация будет происходить в любом случае, - возможно лишь уменьшить(или увеличить) его размер.
Или я ошибаюсь?

>> gettimeofday( &tv, 0 );
>> actual_time = localtime( &(tv.tv_sec ) );
>> strftime( puffer, 17, "%H:%M:%S", localtime( &(tv.tv_sec ) ) );
>
>сделай функцию которая возвращает готовую строку, а то копи-паст плодишь.

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Sockets:проблема с буффером"  
Сообщение от BigHo on 06-Апр-07, 17:52 
>В литературе нашёл сейчас Опции: SO_RCVBUF и SO_SNDBUF. Но, как я понял,
>буфферизация будет происходить в любом случае, - возможно лишь уменьшить(или увеличить)
>его размер.
>Или я ошибаюсь?

В tcp/ip есть расширение (см.в книге Стивенсона UNIX TCP/IP), которые как раз отвечают за склеивание мелких пакетов. Кстати, почему не воспользуешься UNIX TIMESTAMP вместо этого двойного никому не нужного преобразования. Только чтобы обеспечить совместимость используй переменные int32_t или int64_t вместо time_t. Есть также расширения для работы с данными через сеть - XDR и другие иже с ними.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру