Всем доброго дня суток!Некоторое время назад я задавал здесь вопрос относительно проблем с буффером:
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);
}
>Подскажите пожалуйста в чём заключается ошибка и как от неё избавиться.
>полагаю для этого необходимо настроить буффер клиента на отсылку и буффер сервера
>на приём каждый раз лишь одной строчки. Я прав?TCP? ну дык он потоковый т.е. если отправляешь 10 байт, то принимающая сторона может принять все 10 байт сразу, а может частями.. может по одному байт принимать.. т.е. необходимо проверять сколько пришло байт и довычитывать до нужной длины.
> gettimeofday( &tv, 0 );
> actual_time = localtime( &(tv.tv_sec ) );
> strftime( puffer, 17, "%H:%M:%S", localtime( &(tv.tv_sec ) ) );сделай функцию которая возвращает готовую строку, а то копи-паст плодишь.
>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 ) ) );
>
>сделай функцию которая возвращает готовую строку, а то копи-паст плодишь.спасибо за совет,- возможно позже при расширении программы вставлю. Эта часть использовалась у меня до сего пока по одному разу у клиента и у сервера в разных программах, так что много копировать не приходилось...
>В литературе нашёл сейчас Опции: SO_RCVBUF и SO_SNDBUF. Но, как я понял,
>буфферизация будет происходить в любом случае, - возможно лишь уменьшить(или увеличить)
>его размер.
>Или я ошибаюсь?В tcp/ip есть расширение (см.в книге Стивенсона UNIX TCP/IP), которые как раз отвечают за склеивание мелких пакетов. Кстати, почему не воспользуешься UNIX TIMESTAMP вместо этого двойного никому не нужного преобразования. Только чтобы обеспечить совместимость используй переменные int32_t или int64_t вместо time_t. Есть также расширения для работы с данными через сеть - XDR и другие иже с ними.