2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 win32
Сообщение20.08.2006, 02:47 


12/07/06
7
подскажите какие библиотеки надо включить в программу(написана на Си) чтобы работать с реестром.
и ещё если можно подкиньте ссылку на учебные пособия на тему функций виндуса.
я в этом вопросе полный ламер,так что без жестоких наездов :)

 Профиль  
                  
 
 
Сообщение20.08.2006, 03:52 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
MSDN — наш лучший враг. Чисто конкретно registry.

 Профиль  
                  
 
 
Сообщение20.08.2006, 03:57 


12/07/06
7
спасибо

 Профиль  
                  
 
 
Сообщение20.08.2006, 14:07 


12/07/06
7
уменя возник ещё один вопрос,но не вижу создавать две темы подряд,поетаму задам его тут.

я пишу программу на Си,которая должна передавать файлы через сеть.
сокет у неё такой - socket(AF_INET, SOCK_STREAM, 0)

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

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

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

 Профиль  
                  
 
 
Сообщение20.08.2006, 21:36 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
gab писал(а):
всё работает на локальной машине,но когда пытаюсь передать по интернету то происходит ошибка.
сервер отсылает всё как надо,но клиент принимает только каждую четвёртую строку,в остальных он пишет что принял 0 байтов.

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


"Через интернет" - это в пределах локальной сети или действительно по интернету?

Стоят ли дома и на тестируемых машинах одинаковые ОС или разные?

 Профиль  
                  
 
 
Сообщение20.08.2006, 23:23 


13/07/06
68
Цитата:
fopen(c,"rb")
send(l,c,sizeof(c), 0)

там действительно одна и та же переменная с?
Цитата:
перенашу по 1024 в массив

а если размер файла не кратен 1024?
Цитата:
отсылаю размер масива

зачем?
Цитата:
между отсылками стоит функция слип

зачем?
Цитата:
в конце отсылаю строку "конец".

Зачем и как?
Цитата:
в остальных он пишет что принял 0 байтов.

man recv:
Цитата:
The return value will be 0 when the peer has performed an orderly shutdown.

 Профиль  
                  
 
 
Сообщение21.08.2006, 04:09 


12/07/06
7
PAV писал(а):
gab писал(а):
всё работает на локальной машине,но когда пытаюсь передать по интернету то происходит ошибка.
сервер отсылает всё как надо,но клиент принимает только каждую четвёртую строку,в остальных он пишет что принял 0 байтов.

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


"Через интернет" - это в пределах локальной сети или действительно по интернету?

Стоят ли дома и на тестируемых машинах одинаковые ОС или разные?


по интернету.
осы вроде одинаковые,вин хп про на обоих компютерах.

 Профиль  
                  
 
 
Сообщение21.08.2006, 04:16 


12/07/06
7
bugmaker писал(а):
Цитата:
fopen(c,"rb")
send(l,c,sizeof(c), 0)

там действительно одна и та же переменная с?
Цитата:
перенашу по 1024 в массив

а если размер файла не кратен 1024?
Цитата:
отсылаю размер масива

зачем?
Цитата:
между отсылками стоит функция слип

зачем?
Цитата:
в конце отсылаю строку "конец".

Зачем и как?
Цитата:
в остальных он пишет что принял 0 байтов.

man recv:
Цитата:
The return value will be 0 when the peer has performed an orderly shutdown.


вот код.
но помоему в нём ошибок быть не должно,опять же всё работает если запустить на одной машине.
(маленькая ошибка в цикле принятия имени файла,не обращайте на неё внимания)

Цитата:
отсылаю размер масива

зачем?
Цитата:
между отсылками стоит функция слип

зачем?

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

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

Код:
//   ---------------------------------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);
                       
     }
     
     
   }
   
   

 Профиль  
                  
 
 
Сообщение21.08.2006, 15:43 


13/07/06
68
Текст программы не осилил, многовато букв на мой изошрённый вкус. Замечания по мотивам обсуждения:
- передавать размер массива нету никакой надобности. SOCKET_STREAM всё равно смешает данные в одну кучу, а SOCKET_DGRAM сам отлично сообщит сколько данных выслано.
- слип не нужен. Отсылка данных по синхронным сокетам приостановится если данные не будут успевать обрабатывать, а по асинхронным вывалится с ошибкой EAGAIN или EWOULDBLOCK. Применение слипа только увеличит время пересылки на широких каналах но никак не поможет на узких.
Для данной задачи я рекомендовал бы:
- структура "заголовок" фиксированной длины или её длина записывается первым элементом.
- в структуру входит длина файла и его имя.
- после установления соединения отсылающий передаёт заголовок с (возможно) его диной, именем файла и длиной файла, затем считывает файл в буфер и отсылает количество считаных из файла байт (!)
- принимающий получает длину заголовка, если неизвесна, затем сам заголовок, затем считывает поблочно информацию из сокета по блокам до размера, указанного в заголовке. Записывает в файл количество байт, полученных при вызове recv (!).
- обработка значений, получаемых при вызовах send/recv обязательна.
всё остальное - излишне. Если есть желание, могу запостить пример на лиспе. На сях слишком длинное получится, а структура программы та же самая.

 Профиль  
                  
 
 
Сообщение23.08.2006, 16:25 


13/09/05
153
Москва
По поводу реестра - в ATL есть еще вспомогательный класс CRegKey для работы с реестром. Прописан он в atlbase.h.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: TheRuinedMap


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group