URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6306
[ Назад ]

Исходное сообщение
"Sockets:проблема с буффером"

Отправлено Gor , 27-Мрт-07 15:40 
Всем доброго дня суток!

Некоторое время назад я задавал здесь вопрос относительно проблем с буффером:
http://www.opennet.me/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);
        }


Содержание

Сообщения в этом обсуждении
"Sockets:проблема с буффером"
Отправлено vic , 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 ) ) );

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


"Sockets:проблема с буффером"
Отправлено Gor , 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 ) ) );
>
>сделай функцию которая возвращает готовую строку, а то копи-паст плодишь.

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


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

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