OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7264|回复: 6

FreeRTOS+Lwip TCP 客户端接收问题

[复制链接]

3

主题

7

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2018-6-30
在线时间
8 小时
发表于 2018-6-30 11:57:49 | 显示全部楼层 |阅读模式
10金钱
求助高手帮忙
    我用F407 实现 FreeRTOS+LwIP 的客户端程序  现在的问题是  用网络调试助手建立TCPserver  连接后 收发数据确实没什么问题 ,但是2台F407设备的客户端连接后 只能立即和最后一个连接的客户端 发送数据 ,选择给其他连接的客户端发送数据 大概要在14秒后 客户端才能收到数据  网络调试助手尝试过 其他测试客户端 没有这样的问题 ,我在F407 设备上实现server程序  通过多个网络调试助手模拟客户端程序 一切正常,所以 最后我分析 问题还是在于 F407客户端问题上   调试了几天 实在找不到原因 求大家帮忙分析下 代码如下
void task_TCP(void * pvParameters)
{
         //消息队列用
        //BaseType_t errr;
        //char enter=0;
        printf("Task3 start\n");
    ip_addr_t serverIpAddr;
    struct netbuf *revbuf;
    //static struct netbuf  *sentbuf;
          static ip_addr_t loca_ipaddr;
                static u16_t                  loca_port;
    //void *data;
    //u32_t len;
          u32_t data_len = 0;
    err_t err;
                struct pbuf *q;
//    char Text[]="hello i am client! \n";
       
    IP4_ADDR(&serverIpAddr,server_IP[0],server_IP[1],server_IP[2],server_IP[3]);// 服务器IP地址

    tcp_client_conn = netconn_new(NETCONN_TCP);


    while(1)
    {
        if (tcp_client_conn!=NULL)
        {
                 netconn_bind(tcp_client_conn,IP_ADDR_ANY,TCP_SERVER_PORT);   //本地绑定端口和IP  绑定后 使用此IP和端口对外发送
                 err = netconn_connect(tcp_client_conn, &serverIpAddr, TCP_SERVER_PORT);
                if(err != ERR_OK)  
                {
                    //在连接失败后 需要删除tcp_client_conn 句柄 重新创建才行
                    printf("TCP connect fail \n");
                    netconn_delete(tcp_client_conn); //返回值不等于ERR_OK,删除tcp_clientconn连接
                    vTaskDelay(1000);
                    tcp_client_conn = netconn_new(NETCONN_TCP);   //
                }
                else if (err == ERR_OK)
                {
                    //tcp_client_conn->recv_timeout = 10;
                    netconn_getaddr(tcp_client_conn,&loca_ipaddr,&loca_port,1); //获取本地IP主机IP地址和端口号
                    printf("TCP Server 192.168.100.20:9000 连接成功.\r\n");

                    while(1)
                    {

                        if((err = netconn_recv(tcp_client_conn, &revbuf)) == ERR_OK) //接收到数据
                        {

                             memset(tcp_client_recvbuf,0,TCP_CLIENT_RX_BUFSIZE);  //数据接收缓冲区清零
                            //考虑需要进入临界区
                            taskENTER_CRITICAL();
                             for(q=revbuf->p;q!=NULL;q=q->next)  //遍历完整个pbuf链表
                             {
                                    //判断要拷贝到TCP_CLIENT_RX_BUFSIZE中的数据是否大于TCP_CLIENT_RX_BUFSIZE的剩余空间,如果大于
                                    //的话就只拷贝TCP_CLIENT_RX_BUFSIZE中剩余长度的数据,否则的话就拷贝所有的数据
                                    if(q->len > (TCP_CLIENT_RX_BUFSIZE-data_len)) memcpy(tcp_client_recvbuf+data_len,q->payload,(TCP_CLIENT_RX_BUFSIZE-data_len));//拷贝数据
                                    else memcpy(tcp_client_recvbuf+data_len,q->payload,q->len);
                                    data_len += q->len;         
                                    if(data_len > TCP_CLIENT_RX_BUFSIZE) break; //超出TCP客户端接收数组,跳出       

                             }
                             //推出临界区
                             taskEXIT_CRITICAL();
                             data_len=0;  //复制完成后data_len要清零。       
                             //接收完成标志置1
                             //tcp_rev_finish=1;               
                            printf("%s\r\n",tcp_client_recvbuf);
                            netbuf_delete(revbuf);
                             //解析数据包
                             if(my_cjson_Parse((char * )tcp_client_recvbuf)==1)   //接收命令
                            {
                                printf("rev data is suess\n");
                                memset(tcp_client_recvbuf,0x0,TCP_CLIENT_RX_BUFSIZE);  
                            }


                        }
                        else if(err == ERR_CLSD)  //关闭连接
                        {
                            netconn_close(tcp_client_conn);
                            netconn_delete(tcp_client_conn);
                            printf("服务器192.168.100.20:9000断开连接\r\n");
                            break;
                        }
                    }
                }                 
        }
        else
        {
            printf("tcp_client_conn!=OK\n");
        }
        vTaskDelay(1);
    }
    //netconn_close(conn);
    //netconn_delete(conn);
}

最佳答案

查看完整内容[请看2#楼]

看下你,两个板子的ip地址还有mac还有分配的端口
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

193

帖子

0

精华

高级会员

Rank: 4

积分
708
金钱
708
注册时间
2014-7-2
在线时间
137 小时
发表于 2018-6-30 11:57:50 | 显示全部楼层
看下你,两个板子的ip地址还有mac还有分配的端口
回复

使用道具 举报

117

主题

598

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
1694
金钱
1694
注册时间
2012-5-10
在线时间
437 小时
发表于 2018-6-30 21:22:28 | 显示全部楼层
高级语言服务器都是为每一个连接的客户端开启一个线程,如果你不能实现这种的话,那么就使用短链接,会话完毕立即关闭
如有技术问题,微信扫头像交流,STM32,JAVA,服务器
回复

使用道具 举报

17

主题

193

帖子

0

精华

高级会员

Rank: 4

积分
708
金钱
708
注册时间
2014-7-2
在线时间
137 小时
发表于 2018-6-30 23:04:56 | 显示全部楼层
你这意思是,两个407做客户端连网络助手有问题是吧?
回复

使用道具 举报

3

主题

7

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2018-6-30
在线时间
8 小时
 楼主| 发表于 2018-7-2 08:43:58 | 显示全部楼层
你说对了 ,我疏忽了MAC地址了,所有客户端MAC地址都一样 ,修改成唯一性后就好了 非常感谢
回复

使用道具 举报

3

主题

7

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2018-6-30
在线时间
8 小时
 楼主| 发表于 2018-7-2 08:44:30 | 显示全部楼层
qiousanxi 发表于 2018-6-30 23:04
你这意思是,两个407做客户端连网络助手有问题是吧?


你说对了 ,我疏忽了MAC地址了,所有客户端MAC地址都一样 ,修改成唯一性后就好了 非常感谢
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2019-11-26
在线时间
14 小时
发表于 2020-4-20 12:37:27 | 显示全部楼层
楼主你好,方便上传一下代码吗?感激不尽
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 16:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表