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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> File eXchange Protocol, не получается открыть соед. для данных 
:(
    Опции темы
sas8899
Дата 27.12.2008, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



хочу сделать клиент делающий копию сайта FTP.
        User-PI - Server A  (Dest)              User-PI - Server B  (Source)
        ------------------                      ------------------
        
        C->A : Connect                          C->B : Connect
        C->A : PASV
        A->C : 227 Entering Passive Mode. A1,A2,A3,A4,a1,a2
                                                C->B : PORT A1,A2,A3,A4,a1,a2
                                                B->C : 200 Okay
        C->A : STOR                             C->B : RETR

                   B->A : Connect to HOST-A, PORT-a
хочу сделать этот сценарий, но даже конектится не получается.......
вот структура
Код

typedef struct
{
  char *host;
  struct sockaddr_in local_address;           // our local address
  ftptran_t tranmode;                         // current transfer mode
  int passive;                                // if 1, try passive mode

  // Control Connection
  
  int control;                                // main control socket
  char control_readbuf[BUFSIZE];

  // Data Connection

  int data_server;                            // data server socket
  int data_transfer;                          // data transfer connection

} ftpsession_t;

вот соединение для команд(это работает)
Код

ftpsession_t *ftp_connect(char *host)
{
  struct hostent *hent;
  struct sockaddr_in in;
  int len;
  char *basehost;
  ftpsession_t *ftp;  

  //  ftp_errorfile = stderr;

  // allocate ftpsession_t
  
  ftp = malloc(sizeof(*ftp));

  // resolve address

  basehost = getbasehost(host);
  
  if(!(hent = gethostbyname(basehost)))
    return NULL;
    
  ftp->control = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  ftp->passive = 1;

  in.sin_family = AF_INET;
  in.sin_addr.s_addr = ((struct in_addr *) hent->h_addr)->s_addr;
  in.sin_port = getbaseport(host);

  // connect to server

  if(connect(ftp->control, (struct sockaddr *) &in, sizeof(in)) < 0)
    {
      ftp_perror("ftp_connect->connect");
      return NULL;
    }

  // clear command read buffer

  ftp->control_readbuf[0] = '\0';

  // wait for hello message

  if(ftp_getcmdresponse(ftp) != FTP_HELLO)
    {
      // didnt get hello response
      // disconnect and return -1

      ftp_puts("ftp_connect: incorrect response from server");

      close(ftp->control);

      return NULL;
    }

  // get local address

  len = sizeof(ftp->local_address);

  if(getsockname(ftp->control,
         (struct sockaddr *)&ftp->local_address, &len) < 0)
    {
      ftp_perror("ftp_connect->getsockname");

      close(ftp->control);
      return NULL;
    }

  ftp->tranmode = TRAN_UNKNOWN;   // dont know yet

  return ftp;
}


и вот я пытаюсь сделать еще одно соединение для данных(вот это не работает, пишет Network is unreachable
Код

int ftp2ftp_copy(ftpsession_t *src, ftpsession_t *dest)
{
    char tempstr[BUFSIZE];
    struct sockaddr_in in;
    int s_in = sizeof(in);
    long servaddr, servport;
    char *addr;
    int h1, h2, h3, h4, p1, p2;

    
    in.sin_family = AF_INET;
    in.sin_addr.s_addr = inet_addr("ftp.inoveb.ro");
    in.sin_port = htons(20);

      // create socket for transfer

    src->data_transfer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
      
    if(src->data_transfer < 0)
    {
        perror("ftp_accept->socket");
        return -1;
    }
      
      // try to connect
      
    if(connect(src->data_transfer, (struct sockaddr *) &in, sizeof(in)) < 0)////////////вот тут ошибка
    {
        perror("ftp_accept->connect"); 
        return -1;
    }
       
    ftp_sendcmd(src, "PASV", "");

      // make sure we get the correct response

    if(ftp_getcmdresponse(src) == FTP_PASSIVEOK)
    {
        
      // find address

        addr = strchr(cmd_response, '(');

      // if ( not found, return error

        if(!addr)
        {
           printf("ftp_listen: invalid response from server\n");
           return -1;
        }

      // skip past the (

        addr++;
        
      // read address out
      
        if(sscanf(addr, "%d,%d,%d,%d,%d,%d", &h1, &h2, &h3, &h4, &p1, &p2) < 6)
        {
           printf("ftp_listen: invalid response from server\n");
           return -1;
        }
    }
        return 0;
}


Заранее спасибо.

Это сообщение отредактировал(а) sas8899 - 27.12.2008, 22:38
PM MAIL   Вверх
REZiaMIX
Дата 28.12.2008, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

 in.sin_addr.s_addr = inet_addr("ftp.inoveb.ro");

Функции inet_addr можно передавать только IP, используй gethostbyname

Это сообщение отредактировал(а) REZiaMIX - 28.12.2008, 12:49


--------------------
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




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


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

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