Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> передача файлов через сеть 
:(
    Опции темы
gabriil
Дата 20.8.2006, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 13.7.2006

Репутация: нет
Всего: нет



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

вот мой сокет
socket(AF_INET, SOCK_STREAM, 0)

чтобы отослать фаил я открываю его так
fopen(c,"rb")

далее я записываю в массив 1024 байта,отсылаю его сайз а затем сам стринг 
send(l,c,sizeof©, 0)
между двомя отсылками стоит параметр слип.

затем ваил повторяется,до тех пор пока не дошел до EOF,затем посылается сайз остатка и сам остаток файла.

затем посылается "done" при виде которого клиент заканчивает принятие.

вот как я и говорил,уменя на машине всё работает,копирует любой фаил,но когда пытаюсь сделать тоже самое через сеть он принимает только четверть.
тоесть сервер говорит что отсылает 1024 байта а клиент принимает 0,каждый четвёртый стринг клиент принимает нормально.

у когонить есть понятие почему происходит такая каша?
 smile 

PM MAIL   Вверх
Romikgy
Дата 20.8.2006, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



весь код в студию и клиента и сервера (сдобреного кнопачками "код")


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
gabriil
Дата 20.8.2006, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 13.7.2006

Репутация: нет
Всего: нет



Код

   
//   ---------------------------------server------------------------------------------------

int main(int argc, char *argv[])
{
    int i,a,b,l,sin_size,yes=1;
  char c[1000];
  int chd,ps,ch,count,countt;
 char buffer[1024];
 long lSize;
 FILE *Fp;
 struct sockaddr_in my,th;
 time_t start_time, cur_time;
  
  
  
  WSADATA wsaData;
  WSAStartup(MAKEWORD(2,1), &wsaData);
  
  if ((a = socket(AF_INET, SOCK_STREAM, 0)) == -1) 
       {
            printf("\nError Socketing\n");
            exit(1);
        }

       /* if (setsockopt(a,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) == -1) {
            printf("\nError setcoket\n");
            exit(1);
        }*/
  
        my.sin_family = AF_INET;         
        my.sin_port = htons(MYPORT);    
        my.sin_addr.s_addr = INADDR_ANY;
        memset(&(my.sin_zero), '\0', 8); 
  
  if (bind(a, (struct sockaddr *)&my, sizeof(struct sockaddr))== -1) 
       {
         printf("\nError Binding\n");
            exit(1);
        }
  
   memset(c, '\0', 1000); 
  sin_size = sizeof(struct sockaddr_in);

  if (l = listen(a, BACKLOG) == -1)   
        { 
            printf("\nError\n");
            exit(1);
        }

   if((l = accept(a,(struct sockaddr *)&th,&sin_size)) == -1)
             {
              printf("Error");
              break;
             }      
             

      memset(c, '\0', sizeof(c)); // zero the rest of the struct
      if(((b = recv(l,c,sizeof(c)-1,0)) == -1)||(b == 0))
       {
        printf("\nError");
        break;
        }
        
        
                 if( strcmp(c,"copyf") == 0)
          {
              
             memset(c, '\0', sizeof(c)); 
             recv(l,c,sizeof(c)-1,0);               
                               
             if((Fp=fopen(c,"rb")) == NULL)
               {
                send(l,"error",5,0);                                
               }
             else
               {
                  
                  fseek (Fp , 0 , SEEK_END);
                  lSize = ftell (Fp);
                  rewind (Fp);
                  memset(c, '\0', sizeof(c));
                  itoa(lSize,c, 10);
                 if (send(l,c,sizeof(c), 0) == -1)
                  {
                   printf("Error Sending");
                   break;
                  }
                
                  memset(c, '\0', sizeof(c));
                  countt = 0;
                  count =0;
                  ch = 'h';
                 while(ch != EOF)//(countt < lSize)
                 {
                  count = 0;
                  memset(buffer,'\0',1024);
                    while((ch != EOF)&&(count < 1024))
                     {
                      ch=getc(Fp);
                      // if(countt < lSize)
                       // {
                           if(ch != EOF)
                           {
                         buffer[count] = ch;          
                         count++;
                         countt++;
                         }
                    
                         //}
                         //else
                         //break;
                          
                     }
                     
                  memset(c, '\0', 1000);
                  itoa(count,c, 10);
                   if (send(l,c,sizeof(c), 0) == -1)
                   {
                     printf("Error Sending");
                     break;
                   }
                  memset(c, '\0', 1000);
                     printf("send %dbytes\n",count);
                     sleep(35);
                     
                     if (send(l,buffer,sizeof(buffer), 0) == -1)
                       {
                        printf("Error Sending");
                        break;
                       }
                     memset(buffer,'\0',1024);   
                      sleep(35);               
                    } 
                    
                   memset(c, '\0', 1000);
                  itoa(4,c, 10);
                  if (send(l,c,sizeof(c), 0) == -1)
                {
                   printf("Error Sending");
                   break;
                }
                  memset(c, '\0', 1000);
                    
                   sleep(100);
       /*  time(&start_time);
         do
         {
                 time(&cur_time);
         }
         while((cur_time - start_time) < 2);*/

                 if (send(l,"done",4, 0) == -1)
                {
                   printf("Error Sending");
                   break;
                }
                printf("\ndone all");
              fclose (Fp);
             memset(buffer,'\0',1024);
              
               }
                               
          }
          
                closesocket(l);
   }
   



Код

//---------------------------------client-----------------------------------------------
int main(int argc, char *argv[])
{

  struct sockaddr_in th;
  int msg,a,b,l,sizes,sin_size,z,count,size,countt,cc;
  char ch,c[2000],com[1000],d[1000],read[1025],readd[1024];
   struct hostent *h;
   FILE *Fp;
   
   
  WSADATA wsaData;
  WSAStartup(MAKEWORD(2,1), &wsaData);

    a = socket(AF_INET,SOCK_STREAM,0);
    memset(d,'\0',2000);
    
scanf("%s",&d);
h = gethostbyname(d);
 
 
 th.sin_family = AF_INET;   
     th.sin_port = htons(MYPORT);     
       th.sin_addr.s_addr = inet_addr(d);
        memset(&(th.sin_zero), '\0', 8); 

    connect(a, (struct sockaddr *)&th, sizeof(struct sockaddr));
   memset(com,'\0',1000);
      
      
          scanf("\n%s",com);
           
            if(strcmp(com,"copyf") == 0)
             {
          
                if(z = send(a, com, strlen(com), 0) == -1)
                 {
                  printf("\nData sent!");
                  break;
                 }
       
         printf("\nEnter The Name of file you want to copy (client.c) --- ");
        
         memset(com,'\0',1000);
          count =0;
               
               while(com[count-1] != 13)
                {
                    ch = getch();
                      if(ch != 8)
                         { 
                               com[count] = ch;      
                               printf("%c",com[count]);
                               count++;
                         }
                else
                { 
                  com[count] = ch;     
                  printf("%c",com[count]);     
                  printf("%c",32);
                  printf("%c",com[count]); 
                  count--;     
                 }
                }
                
                
                
      com[count-1] = '\0';
      
           if(z = send(a, com, strlen(com), 0) == -1)
            {
             printf("\nError Sending\nDisconecting\n");
             break;
            }
      
            memset(c,'\0',2000);
            recv(a,c,sizeof(c),0);
            if(strcmp(c,"error") != 0)
            { 
             size = atoi(c);
             memset(c,'\0',2000);
            
            
           
           
           memset(read,'\0',1025);
           
           countt = 0;
           strcat(com,".bak");
           
           Fp=fopen(com,"wb+");
           
          while( (strcmp(read,"done") != 0) && (strcmp(read,"error") != 0) )
          {
              memset(readd,'\0',1024);   
              
            if(((z = recv(a,readd,1024,0)) == -1)||(z == 0))
             {
              printf("\nError");
              break;
             }
            sizes = atoi(readd);
            printf("\n%d",sizes);
            memset(readd,'\0',1024);
              
              memset(read,'\0',1024);
            if(((z = recv(a,read,1025,0)) == -1)||(z == 0))
             {
              printf("\nError");
              break;
             }
           
                if((strcmp(read,"done") != 0)&&(strcmp(read,"error") != 0))
                 { 
                     cc=0;
                    /* while(cc < sizes)                  
                    {
                          putc( read[cc], Fp );
                          cc++;
                      }*/
                    // fprintf(Fp,"%s",read);        
                   countt = countt + 1;
                     fwrite (read , 1 , sizes , Fp);
               
               }
               else
               break;
             }
             
             if(countt == size)
              printf("\nok\n");
              else
              printf("/nerror/n");
             
               fclose(Fp);
               sizes = 0;
             }
            memset(c,'\0',sizeof(c)); 
           memset(com,'\0',sizeof(com));
           memset(read,'\0',1025);
                        
     }
     
     
   }
   
   



Это сообщение отредактировал(а) gabriil - 20.8.2006, 15:19
PM MAIL   Вверх
Romikgy
Дата 20.8.2006, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



gabriil, в дальнейшем , если шлешь 2 файла потрудись их разбить на 2 кода, читать легче


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Romikgy
Дата 20.8.2006, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



имхо код написан корявенько 
нашел пару крупную ошибку
в клиенте 
Код

 memset(com,'\0',1000);    
          count =0;    
                
               while(com[count-1] != 13)    
                {    
                    ch = getch();    
                      if(ch != 8)    
                         {    
                               com[count] = ch;       
                               printf("%c",com[count]);    
                               count++;    
                         }    
                else    
                {    
                  com[count] = ch;      
                  printf("%c",com[count]);      
                  printf("%c",32);    
                  printf("%c",com[count]);    
                  count--;      
                 }    
                }    

знаешь че у тя будет при первом сравнении в while ?
и вообще отсылай все строки с завершающим 0 сзаду,
дабы потом проблем не было

Добавлено @ 15:37 
gabriil, уже краще smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
gabriil
Дата 20.8.2006, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 13.7.2006

Репутация: нет
Всего: нет



а разве memset не обнуляет автоматом масив?

а тот кусочек кода это всеголишь принятие имени файла,эта ошибка не влияет на мою проблему.(наверное)
но я исправил спс.

а не аккуратно,это потомучто я полный наб.  smile 

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

PM MAIL   Вверх
Romikgy
Дата 20.8.2006, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Цитата(gabriil @  20.8.2006,  14:58 Найти цитируемый пост)
а вобще когджа запускаешь сервер и клиент на одном компе то нужно подключение к инету?

нет

Цитата(gabriil @  20.8.2006,  14:58 Найти цитируемый пост)
а может быть чисто теоритически,какие проблемы могут быть в передачи через инет,которых не может быть в передачи на одном компе.

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

Кса у тя сервер одноразовый? один раз отдал файл и фсе?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
gabriil
Дата 20.8.2006, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 13.7.2006

Репутация: нет
Всего: нет



да хотябы один 
вобще мистика одна
PM MAIL   Вверх
Rockie
Дата 21.8.2006, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Цитата(gabriil @  20.8.2006,  13:10 Найти цитируемый пост)
проблема в том что программа работает на ура уменя на компютере,но когда прошу друга про тестить она отказывает.

что значит "отказывает"? пишет что не может найти dll/bpl?  или запускается и не работает.
Для певого случая:
Если компилятор BCB:
Project->Options->Linker снять галку use Dynamic RTL
Project->Options->Packajes->Build with runtime packajes снять галку
Project->Options->Compiler жмешь Release

Если компилятор VC то можно почитать здесь




--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
gabriil
Дата 21.8.2006, 03:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 13.7.2006

Репутация: нет
Всего: нет



Цитата(Rockie @ 21.8.2006,  00:45)
Цитата(gabriil @  20.8.2006,  13:10 Найти цитируемый пост)
проблема в том что программа работает на ура уменя на компютере,но когда прошу друга про тестить она отказывает.

что значит "отказывает"? пишет что не может найти dll/bpl?  или запускается и не работает.
Для певого случая:
Если компилятор BCB:
Project->Options->Linker снять галку use Dynamic RTL
Project->Options->Packajes->Build with runtime packajes снять галку
Project->Options->Compiler жмешь Release

Если компилятор VC то можно почитать здесь

Цитата

вот как я и говорил,уменя на машине всё работает,копирует любой фаил,но когда пытаюсь сделать тоже самое через сеть он принимает только четверть.
тоесть сервер говорит что отсылает 1024 байта а клиент принимает 0,каждый четвёртый стринг клиент принимает нормально.

PM MAIL   Вверх
gabriil
Дата 21.8.2006, 04:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 13.7.2006

Репутация: нет
Всего: нет



прошу прощения!!!
не четверть!
с разными фалами по разному,если фаил маленький то примерно четверть,если больше то скакогото момента клиент начинает принимать место 1024 битов просто 24 бита.(каждая третея-четвёртая строка,остальные как и раньше НОЛЬ)
PM MAIL   Вверх
kirjanov
Дата 21.8.2006, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 22.1.2006
Где: Dark wood of erro r

Репутация: 1
Всего: 15



gabriil
вообще че-то не пойму,  ты тспользуешь SOCK_STREAM и UDP функциии. Ты лучше определись, UDP у тебя или TCP
PM MAIL   Вверх
Romikgy
Дата 21.8.2006, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Цитата(kirjanov @  21.8.2006,  09:41 Найти цитируемый пост)
UDP функциии

это где ?

Добавлено @ 11:05 
gabriil
попробуй покурить это
http://www.sources.ru/cpp/cpp_pb_sockets.shtml
а то у тя в коде слишком много ошибок , меня лично захарило править ошибки,
у мя теряются первые байты , где ты мешаешь и что делаешь типа размер передаешь и сами данные передаешь , это все может смешатся в кучу, так что кури выше приведеную ссылку


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
gabriil
Дата 21.8.2006, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 13.7.2006

Репутация: нет
Всего: нет



Цитата(Romikgy @ 21.8.2006,  11:00)
Цитата(kirjanov @  21.8.2006,  09:41 Найти цитируемый пост)
UDP функциии

это где ?

Добавлено @ 11:05 
gabriil
попробуй покурить это
http://www.sources.ru/cpp/cpp_pb_sockets.shtml
а то у тя в коде слишком много ошибок , меня лично захарило править ошибки,
у мя теряются первые байты , где ты мешаешь и что делаешь типа размер передаешь и сами данные передаешь , это все может смешатся в кучу, так что кури выше приведеную ссылку

upd хз где,ткните пальцем я исправлю.


за ссылку спс,но к сожалению я понимаю только язык Си,всё что включает в себя "::" для меня дремучий лес.


а почему это может смешаться в кучу?

PM MAIL   Вверх
Romikgy
Дата 21.8.2006, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



потому как вывод в сокет , имхо, действует наподобии вывода в файл , и вот если ты быстро передаешь и текст и данные , в разных send ' ах , они могут прийти и принятся одним recv smile так что надо или все в едином пакете кидать или выкручиватся по другому,
еще один вариант не передавать сразу весь файл и пусть сокет сам его фрагментирует smile

Добавлено @ 13:07 
Цитата(gabriil @  21.8.2006,  11:25 Найти цитируемый пост)
всё что включает в себя "::" для меня дремучий лес.

а выучить? smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1178 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.