当前位置: 首页 > 知识库问答 >
问题:

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

阴禄
2023-03-14

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

这是我的问题:

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

在服务器端,我看到以下消息:Client 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=hton(cliport);

    谢谢你的帮助

    答:

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

    以下是我的工作代码部分:

    > < li>

    创建套接字:

    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个答案

    阴靖
    2023-03-14

    我单独添加了答案,因此没有人必须在原始帖子中搜索它。

    答:

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

    以下是我的工作代码部分:

    > < li>

    创建套接字:

    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);
    
     类似资料:
    • 我正在创建我的产品,并与这个问题。有一天,我设置了Socket.io,一切都很好。第二天,我将服务器和客户端从http迁移到HTTPS。迁移后客户端和服务器端仍然连接,但不能从客户端发射到服务器,从服务器发射到客户端。 我的ssl证书位于和中,它们加载正确。运行在上的服务器 我的示例react组件。我的react应用程序运行在上。HTTPS连接良好,工作良好。 我该怎么办?也许我在中错误地使用了s

    • 问题内容: 首先,我将请求的文件从服务器发送到客户端,然后再将文件的计算出的sha从服务器发送到客户端,以便客户端可以检查发送文件和接收文件中的sha是相同的。 我设法发送了文件,但是当我尝试也发送sha(这是一个变量)时,我收到一个错误消息(我相信sha也已添加到文件内容中) 如何分别发送? 和客户: 问题答案: 您应该重新设计应用程序的工作方式: 首先,服务器将文件大小发送给客户端 客户端读取

    • 我有套接字服务器(java桌面应用程序)正在等待从java webapp(套接字客户端)连接。通信看起来还可以,我在客户端看到来自服务器的消息,但是当我发送消息时,我在服务器端没有收到任何消息。会有什么问题呢?当我检查服务器与telnet,一切正常。下面是我的代码: 服务器: 客户: 谢谢帮忙!

    • 所以我在玩插座。io正在尝试制作一个多人迷你游戏,但是这个插座。我在客户端使用的emit()函数不起作用。它既不会在客户端浏览器上也不会在服务器控制台上抛出错误。它只是不会发出事件。也许是插座。位于()服务器端,但该服务器端未接收到它。 有一个html文件夹,包含jquery.js,socket.io-1.2.0.js,index.html,main.js和style.css 这是基本的代码,但在

    • 我有一个关于Java插座的技术问题。 例如,假设我有一个Java Sockets服务器和n个多个客户端。是否可以几乎实时地将数据从服务器发送到任何或所有客户端? 更准确地说: 有哪种监听器可以在Sockets客户端中实现 有人能告诉我什么方法是最好的吗?此外,如果有人有一个代码示例,我也会很高兴。 谢谢

    • 我有一个Node.js net socket服务器运行,它在连接到它的客户端数量很少的情况下工作得很好。但是,当我将客户机连接的数量增加到200个时,所有的初始连接都会正确地建立和通信,但是当我按Ctrl-C关闭客户机程序时,服务器上只接收到一些断开的连接(通过错误:read ECONNRESET message)。 我正在监听事件:关闭、超时、断开、错误和结束。我还检查数据事件是否收到长度为0的