Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Ftp checker output problem =\

16K
26 июня 2007 года
4nob1oz
34 / / 14.06.2007
Привет всем. Разобрался я с парсером теперь другая проблема у меня. Пишу фтп чекер и почти написал всё заработало, осталось только автоматизировать процесс как у меня появилась такая проблема.

Вот сам код:
Код:
#include "ftp_func.h"


#define PORT 21        
#define MAX_LINE_TO_READ 1024

 
int main(int argc, char **argv) {
  FILE *inf, *outf;
  char *user, *passwd, *host, *someptr, buffer[MAX_LINE_TO_READ + 1] = {0};

 
 
  if (argc != 3 ) {
     printf("\n---------------------------------------------\n");
     printf(" Usage: parse.exe <input file> <output file>\n");
     printf("---------------------------------------------\n");

     return -1;
  }

  if ((inf = fopen(argv[1], "r")) == NULL) {
     printf("[-] Could not open input file\n");

     return -1;
  }

  printf("[+] Input file opened...\n");

  if ((outf = fopen(argv[2], "w+")) == NULL) {
     printf("[-] Could not open output file\n");

     return -1;
  }

  printf("[+] Output file opened...\n");
  printf("[+] Reading data...\n");

  while(!feof(inf))
  {
     fgets(&buffer[0], MAX_LINE_TO_READ, inf);

     if (someptr = strstr(&buffer[0], "//"))
        user = strtok(&someptr[2], ":");
     else
        user = strtok(&buffer[0], ":");

     passwd = strtok(NULL, "@");
     host = strtok(NULL, "");
     


     char buff [ 1024 ] ;
         
         if ( WSAStartup ( 0x202, ( WSADATA * ) &buff [ 0 ] ) )
         {
                            printf ( " WSAStart error  %d \n ", WSAGetLastError ( ) );
                            return -1;
          }

         SOCKET my_sock ;
          my_sock=socket ( AF_INET, SOCK_STREAM, 0 );
          if  ( my_sock < 0 )        
          {
                            printf (" Socket ( ) error    %d \n ", WSAGetLastError ( ) );
                            return  -1;
          }

          sockaddr_in  dest_addr ;
          dest_addr.sin_family=AF_INET;
          dest_addr.sin_port=htons ( PORT );
          HOSTENT    *hst;  

          if    ( inet_addr ( host) !=INADDR_NONE )    
          {
              dest_addr.sin_addr.s_addr=inet_addr (host) ;
          }
          else

if ((isalpha(host[0]) || isalpha(host[1]) || isalpha(host[2])))
{  
  host[strlen(host)-1] = '\0';
  host = getipbyhostname(host);
}
else continue;

if(hst=gethostbyname(host))
{
    ((unsigned long  *) &dest_addr.sin_addr)[0]=((unsigned long  **) hst->h_addr_list)[0][0];
}
else
{
     printf ( " invalid address   %s \n ", host ) ;
     closesocket ( my_sock ) ;
     WSACleanup ( ) ;
     continue;
}
            if  (connect ( my_sock, ( sockaddr  * ) &dest_addr, sizeof ( dest_addr ) ) )
            {
                            printf (" Connect error  %d \n ", WSAGetLastError ( ) );
                            continue;
            }

            printf (" Successfully connected to %s \n Type quit for quit \n\n" , host );
 
           
            char ftp_user[256],ftp_pass[256],quit[256];
                              strcpy(ftp_user,"USER ");
                              strcat(ftp_user,user);
                              strcat(ftp_user,"\r\n");
                              strcpy(ftp_pass,"PASS ");
                              strcat(ftp_pass,passwd);
                              strcat(ftp_pass,"\r\n");
                              strcpy(quit,"QUIT\r\n");
                              int nsize=NULL;
                             
            while ( nsize!=SOCKET_ERROR )
            {
                nsize = recv ( my_sock, &buff[0], sizeof ( buff ) -1,0 );

                              buff[ nsize ] =0;
                              printf("S=>C: %s", buff);
                             
                              if(send(my_sock,&ftp_user[0],sizeof(ftp_user),0)!=0)
                              {
                                  if(strstr(buff,"331")!=NULL)
                                  {
                                      Sleep(1000);
                                      if(send(my_sock,&ftp_pass[0],sizeof(ftp_pass),0)!=0)
                                      {
                                          if(strstr(buff,"230")!=NULL)
                                          {
                                              Sleep(1000);
                                              send(my_sock,&quit[0],sizeof(ftp_pass),0);
                                              fprintf(outf,"[+]%s%s%s",user,passwd,host);
                                          }
                                          else if(strstr(buff,"530")!=NULL)
                                              {
                                              send(my_sock,&quit[0],sizeof(ftp_pass),0);
                                              fprintf(outf,"[-]%s%s%s",user,passwd,host);
                                              }
                                          }
                                  }
                              }
            }
                             
                               
           
              printf ( " Recv func error  %d \n", WSAGetLastError ( )  );
              closesocket ( my_sock ) ;
              WSACleanup ( ) ;
              continue;

     memset(buffer, MAX_LINE_TO_READ + 1, 0);
  }

  fclose(outf);
  fclose(inf);

  printf("[+] Exiting...\n");

  return 0;
}


Код ftp_func.h:
Код:
#include <stdio.h>
#include <string.h>
#include <winsock2.h>
#include <windows.h>

#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"wininet.lib")

char* getipbyhostname (char * hostName)
{
char * hostIP;
struct hostent *hostInfo;

hostInfo = gethostbyname(hostName);
hostIP = inet_ntoa(*((struct in_addr *)hostInfo->h_addr));

return hostIP;
}


Проблема у меня вот в чем, когда я подсоединяюсь к фтп серверу первым делом записывается ответ в buff потом из buff выводится значение на экран. Далее посылается логин если отослан и в ответе есть 331 отослать пароль если в ответе есть 530 то записать с [-] в файл а если 230 т.е успешно вошли то записать в файл с [+]. Но дело в том что данные то поступают и записываются в buff и складываются там. Если этот участок кода:
Код:
while ( nsize!=SOCKET_ERROR )
            {
                nsize = recv ( my_sock, &buff[0], sizeof ( buff ) -1,0 );

                              buff[ nsize ] =0;
                              printf("S=>C: %s", buff);
                              if(send(my_sock,&ftp_user[0],sizeof(ftp_user),0)!=0)
                              {
                                  if(strstr(buff,"331")!=NULL)
                                  {
                                      Sleep(1000);
                                      if(send(my_sock,&ftp_pass[0],sizeof(ftp_pass),0)!=0)
                                      {
                                          if(strstr(buff,"230")!=NULL)
                                          {
                                              Sleep(1000);
                                              send(my_sock,&quit[0],sizeof(ftp_pass),0);
                                              fprintf(outf,"[+]%s%s%s",user,passwd,host);
                                          }
                                          else if(strstr(buff,"530")!=NULL)
                                              {
                                              send(my_sock,&quit[0],sizeof(ftp_pass),0);
                                              fprintf(outf,"[-]%s%s%s",user,passwd,host);
                                              }
                                         
}
                                  }
                              }
                               
            }
              printf ( " Recv func error  %d \n", WSAGetLastError ( )  );
              closesocket ( my_sock ) ;
              WSACleanup ( ) ;
              continue;


Заменить на этот:
Код:
int nsize;
            while ( ( nsize = recv ( my_sock, &buff[0], sizeof ( buff ) -1,0 ) ) !=SOCKET_ERROR )
            {
       
                              buff[ nsize ] =0;
       
                              printf ( " S=>C: %s ", buff  ) ;
       
                              printf ( "S<=C: " ) ;
                              fgets ( &buff [ 0 ] , sizeof ( buff ) -1, stdin );
       
                             
       
                              send ( my_sock, &buff [ 0 ], nsize, 0 ) ;
              }

              printf ( " Recv error  %d \n", WSAGetLastError ( )  );
              closesocket ( my_sock ) ;
              WSACleanup ( ) ;
              continue;


То давая команды фтп серверу можно увидеть как из buff выводятся все значения а не последнее. Так как же мне сделать так чтобы из buff бралось и выводилость только последнее значение чтобы правильно проанализировать ответ фтп сервера я не знаю.

Товарищи эксперты, кодеры и пользователи ;-) не оставьте без внимания пожалуйста я очень хочу разобраться но чтото никак не выходит у меня. Ответьте кодом пожалуйста, просто я уже много перепробовал сам я новичок в этом деле и когда задался этим вопросом ответа так и не получил нормального.
398
27 июня 2007 года
Alexandoros
630 / / 21.10.2005
Код:
if(send(my_sock,&ftp_user[0],sizeof(ftp_user),0))
{
    nsize = recv ( my_sock, &buff[0], sizeof ( buff ) -1,0 );
    if(nsize == SOCKET_ERROR)
             return error;

    buff[ nsize ] =0;
    if(strcmp(buff, "331"))
        return error;

    if(send(my_sock,&ftp_pass[0],sizeof(ftp_pass),0))
    {
          nsize = recv ( my_sock, &buff[0], sizeof ( buff ) -1,0 );
          if(nsize == SOCKET_ERROR)
             return error;

          buff[ nsize ] =0;

          if(!strcmp(buff,"230"))
          {
                 fprintf(outf,"[+]%s %s %s",user,passwd,host);
          }
          else if (!strcmp(buff,"530"))
          {
               fprintf(outf,"[-]%s %s %s",user,passwd,host);
          }
          else    
              return error;

         
    }
}


Типа того.
16K
28 июня 2007 года
4nob1oz
34 / / 14.06.2007
Вот что получилось:
Код:
#include "ftp_func.h"


#define PORT 21        
#define MAX_LINE_TO_READ 1024


int main(int argc, char **argv)
{
  FILE *inf, *outf;
  char *user, *passwd, *host, *someptr, buffer[MAX_LINE_TO_READ + 1] = {0};
 
  if (argc != 3 )
  {
     printf("\n---------------------------------------------\n");
     printf(" Usage: parse.exe <input file> <output file>\n");
     printf("---------------------------------------------\n");

     return -1;
  }

  if ((inf = fopen(argv[1], "r")) == NULL)
  {
     printf("[-] Could not open input file\n");

     return -1;
  }

  printf("[+] Input file opened...\n");

  if ((outf = fopen(argv[2], "w+")) == NULL)
  {
     printf("[-] Could not open output file\n");

     return -1;
  }

  printf("[+] Output file opened...\n");
  printf("[+] Reading data...\n");

  while(!feof(inf))
  {
     fgets(&buffer[0], MAX_LINE_TO_READ, inf);

     if (someptr = strstr(&buffer[0], "//"))
        user = strtok(&someptr[2], ":");
     else
        user = strtok(&buffer[0], ":");

     passwd = strtok(NULL, "@");
     host = strtok(NULL, "");
     

char buff [1024];

     if (WSAStartup(0x202,(WSADATA *)&buff[0]))
     {
         printf (" WSAStart error %d\n", WSAGetLastError());
         return -1;
     }
     SOCKET my_sock ;
     my_sock=socket(AF_INET, SOCK_STREAM, 0);
     if  (my_sock < 0)
     {
         printf (" Socket() error %d\n", WSAGetLastError());
         return  -1;
     }
     
     sockaddr_in  dest_addr ;
     dest_addr.sin_family=AF_INET;
     dest_addr.sin_port=htons ( PORT );
     HOSTENT    *hst;  

     if (inet_addr(host)!=INADDR_NONE)    
     {
         dest_addr.sin_addr.s_addr=inet_addr (host);
     }
     else if ((isalpha(host[0]) || isalpha(host[1]) || isalpha(host[2])))
     {  
         host[strlen(host)-1] = '\0';
         host = getipbyhostname(host);
     }
     else continue;

     if(hst=gethostbyname(host))
     {
         ((unsigned long  *)&dest_addr.sin_addr)[0]=((unsigned long  **) hst->h_addr_list)[0][0];
     }
     else
     {
         printf ( " Invalid address %s\n", host);
         closesocket (my_sock);
         WSACleanup ();
         continue;
     }

     if (connect(my_sock,(sockaddr  *)&dest_addr, sizeof(dest_addr)))
     {
         printf (" Connect error %d\n", WSAGetLastError ());
         continue;
     }
     
     printf (" Successfully connected to %s \n Type quit for quit \n\n" , host );
             

     char ftp_user[256],ftp_pass[256],quit[256];

     strcpy(ftp_user,"USER ");
     strcat(ftp_user,user);
     strcat(ftp_user,"\r\n");
     strcpy(ftp_pass,"PASS ");
     strcat(ftp_pass,passwd);
     strcat(ftp_pass,"\r\n");
     strcpy(quit,"QUIT\r\n");

     int nsize=NULL;
                             

     while ( nsize!=SOCKET_ERROR )
     {
         nsize = recv ( my_sock, &buff[0], sizeof ( buff ) -1,0 );
         printf("S=>C: %s",buff);
         Sleep(1000);

         if(send(my_sock,&ftp_user[0],sizeof(ftp_user),0)!=SOCKET_ERROR)
         {
             nsize = recv ( my_sock, &buff[0], sizeof ( buff ) -1,0 );
             printf("S=>C: %s",buff);  
             buff[ nsize ] =0;

             if(strcmp(buff, "331")!=NULL)
             {
                 Sleep(1000);

                 if(send(my_sock,&ftp_pass[0],sizeof(ftp_pass),0)!=SOCKET_ERROR)
                 {
                     nsize = recv ( my_sock, &buff[0], sizeof ( buff ) -1,0 );
                     printf("S=>C: %s",buff);
                     buff[ nsize ] =0;

                     if(strstr(buff,"230")!=NULL)
                     {
                         Sleep(1000);
                         printf("S=>C: %s",buff);
                         fprintf(outf,"[+]ftp://%s:%s@%s\n",user,passwd,host);
                         closesocket(my_sock);
                         WSACleanup();
                     }
         
                     else if (strstr(buff,"530")!=NULL)
                     {
                         Sleep(1000);
                         printf("S=>C: %s",buff);
                         fprintf(outf,"[-]ftp://%s:%s@%s\n",user,passwd,host);
                         closesocket (my_sock);
                         WSACleanup ();
                     }
                 }    
             }
         }
     }

     printf ("Recv func error %d\n", WSAGetLastError());
     closesocket (my_sock);
     WSACleanup ();
     continue;

     memset(buffer, MAX_LINE_TO_READ + 1, 0);
  }

  fclose(outf);
  fclose(inf);

  printf("[+] Exiting...\n");

  return 0;
}


Но это конечно для частного случая когда выдаётся ответ в одну строку, а вот если ответ большой то это плохо ;-). Но это чекает и уже хорошо. Попробую доработать. Спасибо Alexandoros за совет.
16K
30 июня 2007 года
4nob1oz
34 / / 14.06.2007
Ух бился бился я так и не получается :( Все способы перебрал уже помойму, никак он у меня этот чекер работать нормально не хочет. Пожалуйста киньте подправленный исходник. Просто опять та же ситуация получается если есть список и например рабочий фтп стоит на пятом месте то программа его заносит как не рабочий, а если его поставить в начало файла или на второе место то всё нормально рабочий говорит :) Так что подправьте пожалуйста а то я застопорился сильно с этим вопросом.
16K
03 июля 2007 года
4nob1oz
34 / / 14.06.2007
Народ ну помогите в фтп чекером ;( Я не знаю как исправить.
398
03 июля 2007 года
Alexandoros
630 / / 21.10.2005
дебугером тебя научить пользоваццо?
И перепеши как я написал
16K
03 июля 2007 года
4nob1oz
34 / / 14.06.2007
Алекс ты что думаешь я не переписывал как ты сказал чтоли? Ну ты попробуй список загнать в 50 ftp гдето и всё прочекать. Первые 4 нормально проверятся а потом начинается тот же геморрой ;( Я уже переделывал раз 100 наверное всё равно одно и тоже. Я поэтому код и выложил весь и прошу подправить потому что просто не знаю уже как решить проблему эту.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог