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

[复制链接]
3962|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搞对了?
 楼主| chuxh 发表于 2021-7-30 19:32 | 显示全部楼层
 楼主| chuxh 发表于 2021-7-30 19:35 | 显示全部楼层
STM32做服务器时需要先用69端口来侦听, 有客户端连上来的时候再创建一个UDP和客户端通信.
stly 发表于 2021-7-30 19:37 | 显示全部楼层
做客户端应该不需要这样做吧
 楼主| chuxh 发表于 2021-7-30 19:41 | 显示全部楼层
只需刚开始建立的UDP来通信就可以了?
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
        {

        }
pengf 发表于 2021-7-30 19:45 | 显示全部楼层
这个是网络传输数据吗?
jiajs 发表于 2021-7-30 19:46 | 显示全部楼层
地址好像是Localhost。
 楼主| chuxh 发表于 2021-7-30 19:49 | 显示全部楼层
结果还是一样
 楼主| chuxh 发表于 2021-7-30 20:01 | 显示全部楼层
哪里设置错了吗?
dingy 发表于 2021-7-30 20:02 | 显示全部楼层
为什么你的port是4096?
wyjie 发表于 2021-7-30 20:04 | 显示全部楼层
不是69吗?
 楼主| chuxh 发表于 2021-7-30 20:06 | 显示全部楼层
客户端连接服务端的69端口, 客户端不一定要用69端口吧.
supernan 发表于 2021-7-30 20:07 | 显示全部楼层
就象服务端69端口收到客户端的请求, 重新开一个空闲端口与客户端通信一样
 楼主| chuxh 发表于 2021-7-30 20:10 | 显示全部楼层
你的程序服务端打印出来的客户端口是69?
wyjie 发表于 2021-7-30 20:14 | 显示全部楼层
应该是服务器设置好IP地址和端口号侦听客户端,客户端连接服务器IP地址和端口号后就可以了
dingy 发表于 2021-7-30 20:16 | 显示全部楼层
话说楼主用的PC工具软件调试服务器好用,调试客户端好用吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

936

主题

11296

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部