gpt4 book ai didi

c++ - tftp 客户端没有从服务器接收(发送到错误的端口)

转载 作者:太空宇宙 更新时间:2023-11-04 14:11:27 27 4
gpt4 key购买 nike

我正在编写自己的 TFTP 客户端。客户端是用 c++(部分是 c)编写的,并在 unix 系统(Linux Debian 稳定版)上运行。

这是我的问题:

我可以将我的读取请求 (RRQ) 发送到 TFTP 服务器(在 Windows XP 上打开 TFTP 服务器)。 TFTP 服务器收到 RRQ,但无法发送应答。

在服务器端我看到这条消息:Client 192.168.1.110:55239 C:\OpenTFTPServer\test.txt, Communication Error

但是端口 55239 不是我在 TFTP-Client 中定义的端口。

这是我的代码部分:

  • 设置客户端和服务器地址:

    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");
  • 连接和绑定(bind):

    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");
  • 连接和绑定(bind):

    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);

最佳答案

我单独添加了答案,所以没有人需要在原帖中搜索它。

回答:

我的问题是,我将错误的套接字与错误的地址结构组合在一起

这是我的工作代码部分:

  • 创建套接字:

    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");
  • 连接和绑定(bind):

    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);

关于c++ - tftp 客户端没有从服务器接收(发送到错误的端口),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13991105/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com