OpenEdv-开源电子网

标题: 基于lwip的TCP客户端同时连接双服务器问题 [打印本页]

作者: dop101    时间: 2016-4-6 09:45
标题: 基于lwip的TCP客户端同时连接双服务器问题
想实现一个服务器给板子发数据,然后板子把数据中转给另一个服务器。如图这样的。
通过两个调试助手,这边发送。在另一个显示这样。
好像只有一个调试助手(代表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;
                                }
                        }
                }
        }
}

作者: dop101    时间: 2016-4-6 09:45
嗷大喵 发表于 2016-4-6 14:28
服务器的ip 可以相同的  你上位机双网卡?

单网卡。恩,服务器Ip可以一样,设置两个socket就可以了。现在就是把服务器IP设置一样,网络调试助手还是不能连接上。是因为单网卡的问题?
作者: 嗷大喵    时间: 2016-4-6 14:28
本帖最后由 嗷大喵 于 2016-4-6 14:37 编辑

服务器的ip 可以相同的  你上位机双网卡?
作者: 嗷大喵    时间: 2016-4-6 15:17
你两个网络调试助手的配置 贴上来 看看?
作者: 皇者~景帝    时间: 2017-10-19 18:01
楼主怎么解决的呢,现在也想弄一个试试,顶一下
作者: 象牙塔    时间: 2017-10-19 19:24
跟网卡没关系,建两个客户端就可以了,地址是IP地址,多对多的呀,连到统一路由器求可以了
作者: lirudi3603    时间: 2017-12-6 10:43

楼主怎么解决的呢,现在也想弄一个试试,顶一下
作者: dop101    时间: 2017-12-21 10:50
lirudi3603 发表于 2017-12-6 10:43
楼主怎么解决的呢,现在也想弄一个试试,顶一下

创建两个线程。理解成两个任务也行。两个客户端连接
作者: 闪电之舞    时间: 2017-12-21 11:24
既然两个netconn  为什么不用两个线程
作者: dop101    时间: 2017-12-22 09:00
闪电之舞 发表于 2017-12-21 11:24
既然两个netconn  为什么不用两个线程

就是两个线程的
作者: 闪电之舞    时间: 2017-12-22 15:44
dop101 发表于 2017-12-22 09:00
就是两个线程的

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

作者: dop101    时间: 2017-12-29 09:22
闪电之舞 发表于 2017-12-22 15:44
我怎么看你都是在一个线程里面你创建了两个连接。。。

上面贴出来的代码是错误的。应该是一个线程,一个端口,当时刚接触以太网,写错了。创建两个socket就OK了
作者: 守望者2481632    时间: 2018-10-23 15:03
dop101 发表于 2017-12-29 09:22
上面贴出来的代码是错误的。应该是一个线程,一个端口,当时刚接触以太网,写错了。创建两个socket就OK了

如果是裸机呢?裸机创建不了双线程,我该如何实现一个客户端与两台服务器通信呢?
作者: GZH931022    时间: 2018-10-27 11:32
好贴帮顶
作者: dop101    时间: 2019-5-7 17:10
守望者2481632 发表于 2018-10-23 15:03
如果是裸机呢?裸机创建不了双线程,我该如何实现一个客户端与两台服务器通信呢?

这个就需要你用个滴答定时器去管控自己的任务了。模拟操作系统的任务调度
作者: 超锦年    时间: 2020-6-4 00:19
dop101 发表于 2017-12-21 10:50
创建两个线程。理解成两个任务也行。两个客户端连接

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




欢迎光临 OpenEdv-开源电子网 (http://47.111.11.73/) Powered by Discuz! X3.4