OpenEdv-开源电子网

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

基于lwip的TCP客户端同时连接双服务器问题

[复制链接]

19

主题

176

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1105
金钱
1105
注册时间
2015-10-27
在线时间
206 小时
发表于 2016-4-6 09:45:18 | 显示全部楼层 |阅读模式
1金钱
想实现一个服务器给板子发数据,然后板子把数据中转给另一个服务器。如图这样的。
通过两个调试助手,这边发送。在另一个显示这样。
好像只有一个调试助手(代表PC的那个)连接上了。另一个链接不上。
修改原子的程序
求大神应该怎么实现,问题出在哪儿
下面是主要程序
//tcp客户端任务函数
static void tcp_client_thread(void *arg)
{
        OS_CPU_SR cpu_sr;
        u32 data_len = 0;
        struct pbuf *q;
        err_t err1,err2,recv_err;
        static ip_addr_t server_ipaddr1,server_ipaddr2,loca_ipaddr;
        static u16_t                  server_port1,server_port2,loca_port;

        LWIP_UNUSED_ARG(arg);
        server_port1 = PC_PORT; //服务器1端口
        server_port2 = WD_PORT;//服务器2端口
        IP4_ADDR(&server_ipaddr1, lwipdev.pcip[0],lwipdev.pcip[1], lwipdev.pcip[2],lwipdev.pcip[3]);//服务器1IP
        IP4_ADDR(&server_ipaddr2, lwipdev.wdip[0],lwipdev.wdip[1], lwipdev.wdip[2],lwipdev.wdip[3]);//服务器2ip
        while (1)
        {
                tcp_clientconn = netconn_new(NETCONN_TCP);  //创建一个TCP链接
                err1 = netconn_connect(tcp_clientconn,&server_ipaddr1,server_port1);//连接服务器1
                delay_ms(500);
                tcp_clientconn1 = netconn_new(NETCONN_TCP);  //创建一个TCP链接
                err2 = netconn_connect(tcp_clientconn1,&server_ipaddr2,server_port2);//连接服务器2

                if(err1&&err2 != ERR_OK)  netconn_delete(tcp_clientconn); //返回值不等于ERR_OK,删除tcp_clientconn连接
                else if (err1&&err2 == ERR_OK)    //处理新连接的数据
                {
                        struct netbuf *recvbuf;
                        tcp_clientconn->recv_timeout = 10;
//                        netconn_getaddr(tcp_clientconn,&loca_ipaddr,&loca_port,1); //获取本地IP主机IP地址和端口号
                        while(1)
                        {
                                       
                                if((recv_err = netconn_recv(tcp_clientconn,&recvbuf)) == ERR_OK)  //接收到数据
                                {       
                                        OS_ENTER_CRITICAL(); //关中断
                                        memset(tcp_client_recvbuf,0,TCP_CLIENT_RX_BUFSIZE);  //数据接收缓冲区清零
                                        for(q=recvbuf->p;q!=NULL;q=q->next)  //遍历完整个pbuf链表
                                        {
                                                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客户端接收数组,跳出       
                                        }
                                        OS_EXIT_CRITICAL();  //开中断
                                        data_len=0;  //复制完成后data_len要清零。
                                        if((tcp_client_flag & LWIP_SEND_DATA) == LWIP_SEND_DATA) //有数据要发送
                                        {
                                        err2 = netconn_write(tcp_clientconn1 ,tcp_client_recvbuf,strlen((char*)tcp_client_recvbuf),NETCONN_COPY); //发送tcp_client_recvbuf中的数据
                                        tcp_client_flag &= ~LWIP_SEND_DATA;
                                        }                                       
                                        netbuf_delete(recvbuf);
                                }else if(recv_err == ERR_CLSD)  //关闭连接
                                {
                                        netconn_close(tcp_clientconn);
                                        netconn_delete(tcp_clientconn);
                                        break;
                                }
                        }
                }
        }
}

最佳答案

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

单网卡。恩,服务器Ip可以一样,设置两个socket就可以了。现在就是把服务器IP设置一样,网络调试助手还是不能连接上。是因为单网卡的问题?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

19

主题

176

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1105
金钱
1105
注册时间
2015-10-27
在线时间
206 小时
 楼主| 发表于 2016-4-6 09:45:19 | 显示全部楼层
嗷大喵 发表于 2016-4-6 14:28
服务器的ip 可以相同的  你上位机双网卡?

单网卡。恩,服务器Ip可以一样,设置两个socket就可以了。现在就是把服务器IP设置一样,网络调试助手还是不能连接上。是因为单网卡的问题?
回复

使用道具 举报

1

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2015-11-26
在线时间
25 小时
发表于 2016-4-6 14:28:48 | 显示全部楼层
本帖最后由 嗷大喵 于 2016-4-6 14:37 编辑

服务器的ip 可以相同的  你上位机双网卡?
回复

使用道具 举报

1

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2015-11-26
在线时间
25 小时
发表于 2016-4-6 15:17:39 | 显示全部楼层
你两个网络调试助手的配置 贴上来 看看?
回复

使用道具 举报

16

主题

107

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
332
金钱
332
注册时间
2015-12-3
在线时间
54 小时
发表于 2017-10-19 18:01:16 | 显示全部楼层
楼主怎么解决的呢,现在也想弄一个试试,顶一下
回复

使用道具 举报

93

主题

745

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1843
金钱
1843
注册时间
2012-9-16
在线时间
285 小时
发表于 2017-10-19 19:24:42 | 显示全部楼层
跟网卡没关系,建两个客户端就可以了,地址是IP地址,多对多的呀,连到统一路由器求可以了
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复

使用道具 举报

3

主题

11

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2017-12-1
在线时间
9 小时
发表于 2017-12-6 10:43:47 | 显示全部楼层

楼主怎么解决的呢,现在也想弄一个试试,顶一下
回复

使用道具 举报

19

主题

176

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1105
金钱
1105
注册时间
2015-10-27
在线时间
206 小时
 楼主| 发表于 2017-12-21 10:50:33 | 显示全部楼层
lirudi3603 发表于 2017-12-6 10:43
楼主怎么解决的呢,现在也想弄一个试试,顶一下

创建两个线程。理解成两个任务也行。两个客户端连接
回复

使用道具 举报

57

主题

358

帖子

0

精华

高级会员

Rank: 4

积分
981
金钱
981
注册时间
2014-9-29
在线时间
261 小时
发表于 2017-12-21 11:24:14 | 显示全部楼层
既然两个netconn  为什么不用两个线程
回复

使用道具 举报

19

主题

176

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1105
金钱
1105
注册时间
2015-10-27
在线时间
206 小时
 楼主| 发表于 2017-12-22 09:00:08 | 显示全部楼层
闪电之舞 发表于 2017-12-21 11:24
既然两个netconn  为什么不用两个线程

就是两个线程的
回复

使用道具 举报

57

主题

358

帖子

0

精华

高级会员

Rank: 4

积分
981
金钱
981
注册时间
2014-9-29
在线时间
261 小时
发表于 2017-12-22 15:44:24 | 显示全部楼层
dop101 发表于 2017-12-22 09:00
就是两个线程的

我怎么看你都是在一个线程里面你创建了两个连接。。。
回复

使用道具 举报

19

主题

176

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1105
金钱
1105
注册时间
2015-10-27
在线时间
206 小时
 楼主| 发表于 2017-12-29 09:22:29 | 显示全部楼层
闪电之舞 发表于 2017-12-22 15:44
我怎么看你都是在一个线程里面你创建了两个连接。。。

上面贴出来的代码是错误的。应该是一个线程,一个端口,当时刚接触以太网,写错了。创建两个socket就OK了
回复

使用道具 举报

15

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2017-8-4
在线时间
48 小时
发表于 2018-10-23 15:03:19 | 显示全部楼层
dop101 发表于 2017-12-29 09:22
上面贴出来的代码是错误的。应该是一个线程,一个端口,当时刚接触以太网,写错了。创建两个socket就OK了

如果是裸机呢?裸机创建不了双线程,我该如何实现一个客户端与两台服务器通信呢?
回复

使用道具 举报

10

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
362
金钱
362
注册时间
2018-5-14
在线时间
46 小时
发表于 2018-10-27 11:32:38 | 显示全部楼层
好贴帮顶
回复

使用道具 举报

19

主题

176

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1105
金钱
1105
注册时间
2015-10-27
在线时间
206 小时
 楼主| 发表于 2019-5-7 17:10:17 | 显示全部楼层
守望者2481632 发表于 2018-10-23 15:03
如果是裸机呢?裸机创建不了双线程,我该如何实现一个客户端与两台服务器通信呢?

这个就需要你用个滴答定时器去管控自己的任务了。模拟操作系统的任务调度
回复

使用道具 举报

0

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2019-9-3
在线时间
18 小时
发表于 2020-6-4 00:19:29 | 显示全部楼层
dop101 发表于 2017-12-21 10:50
创建两个线程。理解成两个任务也行。两个客户端连接

您是怎么创建的两个线程,想看一下您的程序
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 17:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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