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

Исходное сообщение
"Программирование Sockets.Проблема с буффером."

Отправлено Gor , 18-Янв-07 12:12 
Всем привет,
я пытаюсь написать программу 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
(первые цифры - нумерация)

с чем это может быть связано?

Спасибо


Содержание

Сообщения в этом обсуждении
"Программирование Sockets.Проблема с буффером."
Отправлено BigHo , 18-Янв-07 12:15 
как насчет куска кода для сервера и клиента ?



"Программирование Sockets.Проблема с буффером."
Отправлено Gor , 18-Янв-07 12:46 
>как насчет куска кода для сервера и клиента ?


да,конечно.
Ниже привожу фрагмент 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;
}



"Программирование Sockets.Проблема с буффером."
Отправлено BigHo , 18-Янв-07 13:53 
Убери static у buffer для кода сервера

"Программирование Sockets.Проблема с буффером."
Отправлено Gor , 18-Янв-07 12:50 
>как насчет куска кода для сервера и клиента ?


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);
   }


"Программирование Sockets.Проблема с буффером."
Отправлено NuINu , 18-Янв-07 13:22 
А в чем ошибки то?



"Программирование Sockets.Проблема с буффером."
Отправлено Gor , 18-Янв-07 13:29 
>А в чем ошибки то?


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


"Программирование Sockets.Проблема с буффером."
Отправлено NuINu , 18-Янв-07 13:46 
>>А в чем ошибки то?
>
>
>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';
Возможно поможет. ;-))

Вообще то не плохо выяснить, в какой посылке приходят неверные строки, совет: выведи все что посылаешь на терминале сервера, разделяя каждую посылку спец строками: |--------------|
и тоже сделай у клиента.
Потом можешь написать сюда еще разик, с результатом.


"Программирование Sockets.Проблема с буффером."
Отправлено Gor , 18-Янв-07 16:09 
>>
>добавляй после каждого приема в буфер
>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;

    }


"Программирование Sockets.Проблема с буффером."
Отправлено koser , 18-Янв-07 16:40 
А что это за квыдратик после \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);

"Программирование Sockets.Проблема с буффером."
Отправлено Gor , 18-Янв-07 17:06 
>А что это за квыдратик после \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. При вставке сообщения и отсылке его, ети знаки заменяются у меня на квадратик...


"Программирование Sockets.Проблема с буффером."
Отправлено NuINu , 18-Янв-07 16:43 
>>>
>>добавляй после каждого приема в буфер
>>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")
.....


"Программирование Sockets.Проблема с буффером."
Отправлено BigHo , 18-Янв-07 17:09 
повторюсь: убери static у buffer для кода сервера. static делает буфер глобальным. Вопрос - зачем ?

"Программирование Sockets.Проблема с буффером."
Отправлено Gor , 18-Янв-07 17:25 
>повторюсь: убери static у buffer для кода сервера. static делает буфер глобальным.
>Вопрос - зачем ?

Yyps,sory.
Я пропустил Ващ ответ.Сейчас попробую.
Спасибо!


"Программирование Sockets.Проблема с буффером."
Отправлено Gor , 18-Янв-07 17:22 
Это вырезка с сервера:


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



"Программирование Sockets.Проблема с буффером."
Отправлено NuINu , 18-Янв-07 17:33 
>Это вырезка с сервера:

А ну да, клиент не обязан принимать сообщения в той же порционности что они посылаются сервером. Отладку с клиента можешь убрать.
Можно попробовать строго форматировать сообщения, допустим добавлять 2 байта длины перед каждой посылкой, а уже в клиенте добавить, перед циклом чтения самого сообщения, операцию чтения длины, и уже читать не весь буфер, а положенную данному сообщению длину.

вообщем убери пока отладку на клиенте и смотри, помог ли 0 в конце в твоей беде.



"Программирование Sockets.Проблема с буффером."
Отправлено Gor , 18-Янв-07 17:47 
>вообщем убери пока отладку на клиенте и смотри, помог ли 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


"Программирование Sockets.Проблема с буффером."
Отправлено Gor , 18-Янв-07 18:01 
>вообщем убери пока отладку на клиенте и смотри, помог ли 0 в
>конце в твоей беде.

Yohohoho!!!!!

РАБОТАЕТ!!! РАБОТАЕТ!!! РАБОТАЕТ!!!

Я не тот файл в прошлый раз компилировал, странно, от чего он вообще результат улучшил:))
Сейчас с откомпалил,-все работает!!!
Огромное спасибо Вам!!!
"Висел" на этой проблеме уже 2 дня...

Yoho!!!!!