tftp клиент не получает с сервера (отправить на неверный порт)

Я пишу свой собственный TFTP-клиент.
Клиент написан на c ++ (частично c) и работает в Unix-системе (стабильный Linux Debian).

Вот моя проблема:

Я могу отправить свой запрос на чтение (RRQ) на TFTP-сервер (Open TFTP Server в Windows XP). TFTP-сервер получает RRQ, но не может отправить ответ.

На стороне сервера я вижу это сообщение: Клиент 192.168.1.110:55239 C: \ OpenTFTPServer \ test.txt, Ошибка связи

Но порт 55239 не является портом, который я определил в моем TFTP-клиенте.

Вот мои части кода:

  • установить адреса клиента и сервера:

    memset(&servaddr,0,sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(servport); // servport=69
    servaddr.sin_addr.s_addr = inet_addr("192.168.1.152");
    
    memset(&cliaddr,0,sizeof(cliaddr));
    cliaddr.sin_family = AF_INET;
    cliaddr.sin_port = htons(cliport); // cliport=13337
    cliaddr.sin_addr.s_addr = inet_addr("192.168.1.110");
    
  • соединять & связать:

    if (connect(serv, (struct sockaddr *) &servaddr, serv_length) < 0)
    {
    bail("Unable to connect with the server!");
    }
    if(bind(cli, (struct sockaddr *)&cliaddr, cli_length)<0)
    {
    bail("Unable to bind to adr & port!");
    }
    
  • создать запрос TFTP:

    memset( &cBuf1, 0, sizeof cBuf1);
    rdwrFrame = (struct tftp_wr_rq *)&cBuf1;
    rdwrFrame->opcode=htons(1);
    rdwrFrame->data={'t','e','s','t','.','t','x','t','\0','o','c','t','e','t','\0'};
    
  • отправить запрос TFTP:

    if (sendto (serv,cBuf1,19,0,(struct sockaddr *)&servaddr,serv_length) < 0)
    {
    bail ("Send the first requirment Frame error -- UDP");
    }
    

Вот мой вопрос:

Что я делаю не так, что TFTP-сервер получает неверный порт? Я думал, что это должно быть установлено с cliaddr.sin_port = htons (cliport);

Спасибо за вашу помощь & С уважением
Рико

Ответ:

Моя проблема была в том, что я объединил неправильные сокеты с неправильными структурами адреса

Вот мои рабочие части кода:

  • создать сокеты:

    serv = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (serv < 0)
    {
    bail("Unable to create socket tx!");
    }
    
    cli = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (cli < 0)
    {
    bail("Unable to create socket rx!");
    }
    
  • установить адреса клиента и сервера:

    memset(&servaddr,0,sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(servport);
    servaddr.sin_addr.s_addr = inet_addr("192.168.1.152");
    
    memset(&cliaddr,0,sizeof(cliaddr));
    cliaddr.sin_family = AF_INET;
    cliaddr.sin_port = htons(cliport);
    cliaddr.sin_addr.s_addr = inet_addr("192.168.1.110");
    
  • соединять & связать:

    if(bind(cli, (struct sockaddr *)&cliaddr, cli_length)<0)
    {
    bail("Unable to bind to adr & port!");
    }
    
    if (connect(serv, (struct sockaddr *) &servaddr, serv_length) < 0)
    {
    bail("Unable to connect with the server!");
    }
    
  • создать TFTP-запрос:

    memset( &cBuf1, 0, sizeof cBuf1);
    rdwrFrame = (struct tftp_wr_rq *)&cBuf1;
    rdwrFrame->opcode=htons(1);
    rdwrFrame->data={'t','e','s','t','.','t','x','t',(char)0,'o','c','t','e','t',(char)0};
    
  • отправить TFTP-запрос:

    if (sendto (cli,cBuf1,19,0,(struct sockaddr *)&servaddr,serv_length) < 0)
    {
    bail ("Send the first requirment Frame error -- UDP");
    }
    
  • получить данные:

    recvfrom(cli,cBuf2,19,0,(struct sockaddr *)&cliaddr,(socklen_t*)&cli_length);
    

1

Решение

Я добавил ответ отдельно, поэтому никто не должен искать его в оригинальном сообщении.

Ответ:

Моя проблема была в том, что я объединил неправильные сокеты с неправильными структурами адреса

Вот мои рабочие части кода:

  • создать сокеты:

    serv = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (serv < 0)
    {
    bail("Unable to create socket tx!");
    }
    
    cli = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (cli < 0)
    {
    bail("Unable to create socket rx!");
    }
    
  • установить адреса клиента и сервера:

    memset(&servaddr,0,sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(servport);
    servaddr.sin_addr.s_addr = inet_addr("192.168.1.152");
    
    memset(&cliaddr,0,sizeof(cliaddr));
    cliaddr.sin_family = AF_INET;
    cliaddr.sin_port = htons(cliport);
    cliaddr.sin_addr.s_addr = inet_addr("192.168.1.110");
    
  • соединять & связать:

    if(bind(cli, (struct sockaddr *)&cliaddr, cli_length)<0)
    {
    bail("Unable to bind to adr & port!");
    }
    
    if (connect(serv, (struct sockaddr *) &servaddr, serv_length) < 0)
    {
    bail("Unable to connect with the server!");
    }
    
  • создать TFTP-запрос:

    memset( &cBuf1, 0, sizeof cBuf1);
    rdwrFrame = (struct tftp_wr_rq *)&cBuf1;
    rdwrFrame->opcode=htons(1);
    rdwrFrame->data={'t','e','s','t','.','t','x','t',(char)0,'o','c','t','e','t',(char)0};
    
  • отправить TFTP-запрос:

    if (sendto (cli,cBuf1,19,0,(struct sockaddr *)&servaddr,serv_length) < 0)
    {
    bail ("Send the first requirment Frame error -- UDP");
    }
    
  • получить данные:

    recvfrom(cli,cBuf2,19,0,(struct sockaddr *)&cliaddr,(socklen_t*)&cli_length);
    
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]