Всем привет,
я пытаюсь написать программу Server-Client программу посредством TCP/IP(Socket).Задача для Server-программы - запросить актуальное время у системы в формате часов,минут,секунд,милли- и микросекунд и отослать его Client.
Там оно просто должно быть выведено на екран или сохранено.Проблема:
Получаемые Strings содержат ошибки.
Как например:
3.578 10:26:31.336680
3.579 10:26:31.336686
9 10:23.580 10:26:31.336693
3.581 10:26:31.337516
3.582 10:26:31.337525
(первые цифры - нумерация)с чем это может быть связано?
Спасибо
как насчет куска кода для сервера и клиента ?
>как насчет куска кода для сервера и клиента ?
да,конечно.
Ниже привожу фрагмент Server-программы.
Н ругайте только сильно мои программёрские навыки;) ,-я занимаюсь программированием всего три месяца.
некоторые части кода я скопировал из других программ,до конца не понимая, как они работают.:(
while (1)
{
static char buffer[256];
int a,i;
struct timeval tv;
struct tm *actual_time;
char vorbuffer[10];for(a=1;a<=10;a++)
{
for(i=1; i<=1000;i++)
{ gettimeofday( &tv, 0 );
actual_time = localtime( &(tv.tv_sec ) );
strftime(vorbuffer,10, "%H:%M:%S", localtime( &(tv.tv_sec ) ) );sprintf(buffer,"%d.%d\t%s.ld\n",a,i,vorbuffer, tv.tv_usec);
length = strlen(buffer);
send(client_fd, buffer, length, 0);
}
sleep(1);
}
return 0;
}
Убери static у buffer для кода сервера
>как насчет куска кода для сервера и клиента ?
A eto Client:while (1)
{
length = recv(sock_fd, buffer, 256, 0);
if (length == 0)
{ printf("Connection closed by remote host.\n");
break;
}printf("%s",buffer);
}
А в чем ошибки то?
>А в чем ошибки то?
3.578 10:26:31.336680
3.579 10:26:31.336686
9 10:23.580 10:26:31.336693 - эта строка не соответствует стандарту.
3.581 10:26:31.337516
3.582 10:26:31.337525Кроме того, в конце каждого внутреннего цикла и переходе на следующий происходит следующее смещение:
2.998 10:26:30.331470
2.999 10:26:30.331477
2.1000 10:26:30.331483
0 10:26:30.333.1 10:26:31.332734
3.2 10:26:31.332789
3.3 10:26:31.332798
>>А в чем ошибки то?
>
>
>3.578 10:26:31.336680
>3.579 10:26:31.336686
>9 10:23.580 10:26:31.336693 - эта строка
>не соответствует стандарту.
>3.581 10:26:31.337516
>3.582 10:26:31.337525
>
>Кроме того, в конце каждого внутреннего цикла и переходе на следующий происходит
>следующее смещение:
>
>2.998 10:26:30.331470
>2.999 10:26:30.331477
>2.1000 10:26:30.331483
>0 10:26:30.333.1 10:26:31.332734
>3.2 10:26:31.332789
>3.3 10:26:31.332798
>
>
добавляй после каждого приема в буфер
buf[bytes_read] = '\0';
Возможно поможет. ;-))Вообще то не плохо выяснить, в какой посылке приходят неверные строки, совет: выведи все что посылаешь на терминале сервера, разделяя каждую посылку спец строками: |--------------|
и тоже сделай у клиента.
Потом можешь написать сюда еще разик, с результатом.
>>
>добавляй после каждого приема в буфер
>buf[bytes_read] = '\0';
>Возможно поможет. ;-))я не знаю, как мне это добавить правильно.
Подробной документации нигде не нашёл.
если не сложно,-поподробнее опишите.
>Вообще то не плохо выяснить, в какой посылке приходят неверные строки, совет:
>выведи все что посылаешь на терминале сервера, разделяя каждую посылку спец
>строками: |--------------|
>и тоже сделай у клиента.
>Потом можешь написать сюда еще разик, с результатом.
Интересная идея!
Ниже результат добавления "спец.строк" и измененный код.
полный хаус...1.1 13:50:40.138692
------------------
+++++++++++
1.2 13:5------------------
0:40.138832
++++++++------------------
+++
1.3 13:50:40.138------------------
842
+++++++++++
1.4 ------------------
13:50:40.138850
++++------------------
+++++++
1.5 13:50:40------------------
.138857
+++++++++++
------------------Client:
while (1)
{
length = recv(sock_fd, buffer, 20, 0);
if (length == 0) {
printf("Connection closed by remote host.\n");
break;
}printf("%s",buffer);
printf("------------------\n");
}
close(sock_fd);
return(0);
}
Server:while (1)
{
int a,i;
struct timeval tv;
struct tm *actual_time;
char vorbuffer[9];for(a=1;a<=10;a++){
for(i=1; i<100;i++){gettimeofday( &tv, 0 );
actual_time = localtime( &(tv.tv_sec ) );
strftime(vorbuffer,9, "%H:%M:%S", localtime( &(tv.tv_sec ) ) );
sprintf(buffer,"%d.%d\t%s.ld\n",a,i,vorbuffer, tv.tv_usec);
length = strlen(buffer);
send(client_fd, buffer, length, 0);
sprintf(buffer,"+++++++++++\n");
length = strlen(buffer);
send(client_fd,buffer,length,0);}
sleep(1);
}
return 0;}
А что это за квыдратик после \t%s. ?
sprintf(buffer,"%d.%d\t%s.ld\n",a,i,vorbuffer, tv.tv_usec);
Мне кажется лучше так
sprintf(buffer,"%d.%d\t%s.%d\n",a,i,vorbuffer, tv.tv_usec);
>А что это за квыдратик после \t%s. ?
>sprintf(buffer,"%d.%d\t%s.ld\n",a,i,vorbuffer, tv.tv_usec);
>Мне кажется лучше так
>sprintf(buffer,"%d.%d\t%s.%d\n",a,i,vorbuffer, tv.tv_usec);Оно так и есть у меня. И ещё 06 перед ld. При вставке сообщения и отсылке его, ети знаки заменяются у меня на квадратик...
>>>
>>добавляй после каждого приема в буфер
>>buf[bytes_read] = '\0';
>>Возможно поможет. ;-))
>
>я не знаю, как мне это добавить правильно.
см. ниже
Какой кошмар!!!
Я не просил ничего дополнительно передавать через сокеты!!!
просто напиши:
Клиент:
length = recv(sock_fd, buffer, 20, 0);
if (length == 0) {
printf("Connection closed by remote host.\n");
break;
}
buffer[length] = '\0';
printf("%s",buffer);
printf("\n|------------------|\n");
.....Сервер:
sprintf(buffer,"%d.%d\t%s.%ld\n",a,i,vorbuffer, tv.tv_usec);
length = strlen(buffer);
send(client_fd, buffer, length, 0);
printf("%s",buffer);
printf("\n|+++++++++++|\n")
.....
повторюсь: убери static у buffer для кода сервера. static делает буфер глобальным. Вопрос - зачем ?
>повторюсь: убери static у buffer для кода сервера. static делает буфер глобальным.
>Вопрос - зачем ?Yyps,sory.
Я пропустил Ващ ответ.Сейчас попробую.
Спасибо!
Это вырезка с сервера:
19.33 15:09:48.895025|++++++++++++|
19.34 15:09:48.895100|++++++++++++|
19.35 15:09:48.895175|++++++++++++|
19.36 15:09:48.895251|++++++++++++|
19.37 15:09:48.895326
Это вырезка с Client:
19.32 1------------------
5:09:48.894948
19.33------------------
15:09:48.895025
19.------------------
34 15:09:48.895100
1------------------
9.35 15:09:48.895175------------------19.36 15:09:48.8952------------------
51
19.37 15:09:48.89------------------
5326
19.38 15:09:48.------------------
895401
>Это вырезка с сервера:А ну да, клиент не обязан принимать сообщения в той же порционности что они посылаются сервером. Отладку с клиента можешь убрать.
Можно попробовать строго форматировать сообщения, допустим добавлять 2 байта длины перед каждой посылкой, а уже в клиенте добавить, перед циклом чтения самого сообщения, операцию чтения длины, и уже читать не весь буфер, а положенную данному сообщению длину.вообщем убери пока отладку на клиенте и смотри, помог ли 0 в конце в твоей беде.
>вообщем убери пока отладку на клиенте и смотри, помог ли 0 в
>конце в твоей беде.Частота возникновения ошибки внутри внутреннего цикла Очень сильно понизилась. Точнее - Одна ошибка на 2000 строк.
Другая проблема осталась без изменения - между циклами всегда происходит смещение:1.98 15:39:23.092134
1.99 15:39:23.092148
.99 15:39:2.1 15:39:24.095475
2.2 15:39:24.095629
2.3 15:39:24.095707
>вообщем убери пока отладку на клиенте и смотри, помог ли 0 в
>конце в твоей беде.Yohohoho!!!!!
РАБОТАЕТ!!! РАБОТАЕТ!!! РАБОТАЕТ!!!
Я не тот файл в прошлый раз компилировал, странно, от чего он вообще результат улучшил:))
Сейчас с откомпалил,-все работает!!!
Огромное спасибо Вам!!!
"Висел" на этой проблеме уже 2 дня...Yoho!!!!!