打印
[STM32F2]

STM32F207做TFTP客户端收不到TFTP服务器的数据问题

[复制链接]
3184|38
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chuxh|  楼主 | 2021-7-30 19:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ST提供的例程做IAP时STM32是做tftp服务器的。因项目需要,我们需要STM32做客户端。
主要的程序如下:
    UDPpcb = udp_new();
    if (UDPpcb != NULL)
    {
        /*assign destination IP address */
        IP4_ADDR( &dest_ip, 192, 9, 50, 224 );
        /* configure destination IP address and port */
        err= udp_connect(UDPpcb, &dest_ip, 69);
        if (err == ERR_OK)
        {
            /* Set a receive callback for the upcb */
            udp_recv(UDPpcb, tftp_recv_callback, NULL);
            len = sprintf (data, "%c%c%s%c%s%c", 0x00, TFTP_RRQ, "app.bin", 0x00, "octet", 0x00);
            /* allocate pbuf from pool*/
            p = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_POOL);
            if (p != NULL)
            {
                /* copy data to pbuf */
                pbuf_take(p, (char*)data, len);
                /* send udp data */
                udp_send(UDPpcb, p);
                /* free pbuf */
                pbuf_free(p);
            }
            else
            {
                printf("Can not allocate pbuf\r\n");
            }
        }
但在测试中发现tftp_recv_callback从来没被调用

使用特权

评论回复
沙发
supernan| | 2021-7-30 19:21 | 只看该作者
还有什么现象呢?能再详细描述下吗

使用特权

评论回复
板凳
chuxh|  楼主 | 2021-7-30 19:25 | 只看该作者
导致服务器端收不到ACK而超时终止文件传输

使用特权

评论回复
地板
pengf| | 2021-7-30 19:28 | 只看该作者
服务器IP搞对了?

使用特权

评论回复
5
chuxh|  楼主 | 2021-7-30 19:32 | 只看该作者
对的

使用特权

评论回复
6
chuxh|  楼主 | 2021-7-30 19:35 | 只看该作者
STM32做服务器时需要先用69端口来侦听, 有客户端连上来的时候再创建一个UDP和客户端通信.

使用特权

评论回复
7
stly| | 2021-7-30 19:37 | 只看该作者
做客户端应该不需要这样做吧

使用特权

评论回复
8
chuxh|  楼主 | 2021-7-30 19:41 | 只看该作者
只需刚开始建立的UDP来通信就可以了?

使用特权

评论回复
9
yszong| | 2021-7-30 19:43 | 只看该作者
贴个我设置的
/* 69 is the port used for TFTP protocol initial transaction */
        uint16_t port = 69;

        /* Create a new UDP control block */
        upcb = udp_new();

        if(upcb != NULL)
        {
                /* assign destination IP address */
                IP4_ADDR(&destIPaddr, DEST_IP_ADDR0, DEST_IP_ADDR1, DEST_IP_ADDR2, DEST_IP_ADDR3);

                /* configure destination IP address and port */
                err = udp_connect(upcb, &destIPaddr, port);

                if(err == ERR_OK)
                {
                        /* Set a receive callback for the upcb */
                        udp_recv(upcb, app_tftp_recv_callback, NULL);

                        //sprintf((char*)data, "sending udp client message %d", (int*)message_count);
                        pstr = &data[0];
                        message_count = 0;
                        *pstr++ = 0x00;
                        *pstr++ = TFTP_RRQ;                        //读报文
                        //*pstr++ = TFTP_WRQ;                //写报文

                        tm_strcpy(pstr, "999407.bin");
                        pstr += (strlen("999407.bin") + 1);

                        tm_strcpy(pstr, "octet");
                        pstr += (strlen("octet") + 1);

                        tm_strcpy(pstr, "blksize");
                        pstr += (strlen("blksize") + 1);

                        memset(buf, 0x00, sizeof(buf));
                        sprintf((char*)buf, "%d", 512);
                        tm_strcpy(pstr, buf);
                        pstr += (tm_strlen(buf) + 1);

                        tm_strcpy(pstr, "tsize");
                        message_count += strlen("tsize");
                        pstr += (strlen("tsize") + 1);

                        memset(buf, 0x00, sizeof(buf));
                        sprintf((char*)buf, "%d", 0);
                        tm_strcpy(pstr, buf);
                        pstr += (tm_strlen(buf) + 1);
                        message_count = pstr - &data[0];

                        /* allocate pbuf from pool */
                        p = pbuf_alloc(PBUF_TRANSPORT, message_count, PBUF_POOL);

                        if(p != NULL)
                        {
                                /* copy data to pbuf */
                                pbuf_take(p, (char*)data, message_count);

                                /* send udp data */
                                udp_send(upcb, p);

                                /* free pbuf */
                                pbuf_free(p);
                        }
                        else
                        {
                       
                        }
                }
                else
                {

                }
        }
        else
        {

        }

使用特权

评论回复
10
pengf| | 2021-7-30 19:45 | 只看该作者
这个是网络传输数据吗?

使用特权

评论回复
11
jiajs| | 2021-7-30 19:46 | 只看该作者
地址好像是Localhost。

使用特权

评论回复
12
chuxh|  楼主 | 2021-7-30 19:49 | 只看该作者
结果还是一样

使用特权

评论回复
13
chuxh|  楼主 | 2021-7-30 20:01 | 只看该作者
哪里设置错了吗?

使用特权

评论回复
14
dingy| | 2021-7-30 20:02 | 只看该作者
为什么你的port是4096?

使用特权

评论回复
15
wyjie| | 2021-7-30 20:04 | 只看该作者
不是69吗?

使用特权

评论回复
16
chuxh|  楼主 | 2021-7-30 20:06 | 只看该作者
客户端连接服务端的69端口, 客户端不一定要用69端口吧.

使用特权

评论回复
17
supernan| | 2021-7-30 20:07 | 只看该作者
就象服务端69端口收到客户端的请求, 重新开一个空闲端口与客户端通信一样

使用特权

评论回复
18
chuxh|  楼主 | 2021-7-30 20:10 | 只看该作者
你的程序服务端打印出来的客户端口是69?

使用特权

评论回复
19
wyjie| | 2021-7-30 20:14 | 只看该作者
应该是服务器设置好IP地址和端口号侦听客户端,客户端连接服务器IP地址和端口号后就可以了

使用特权

评论回复
20
dingy| | 2021-7-30 20:16 | 只看该作者
话说楼主用的PC工具软件调试服务器好用,调试客户端好用吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

936

主题

11296

帖子

2

粉丝