[STM32F4] 用netconn接口,TCP客户端模式,连接两个服务器应该怎么实现

[复制链接]
 楼主| 小小电子工程师 发表于 2016-4-6 09:51 | 显示全部楼层 |阅读模式
想实现一个服务器给板子发数据,然后板子把数据中转给另一个服务器。如图这样的。
通过两个调试助手,这边发送。在另一个显示这样。
好像只有一个调试助手(代表PC的那个)连接上了。另一个链接不上。
求大神应该怎么实现,问题出在哪儿
  1. //tcp客户端任务函数
  2. static void tcp_client_thread(void *arg)
  3. {
  4.         OS_CPU_SR cpu_sr;
  5.         u32 data_len = 0;
  6.         struct pbuf *q;
  7.         err_t err1,err2,recv_err;
  8.         static ip_addr_t server_ipaddr1,server_ipaddr2,loca_ipaddr;
  9.         static u16_t                  server_port1,server_port2,loca_port;

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

  22.                 if(err1&&err2 != ERR_OK)  netconn_delete(tcp_clientconn); //返回值不等于ERR_OK,删除tcp_clientconn连接
  23.                 else if (err1&&err2 == ERR_OK)    //处理新连接的数据
  24.                 {
  25.                         struct netbuf *recvbuf;
  26.                         tcp_clientconn->recv_timeout = 10;
  27. //                        netconn_getaddr(tcp_clientconn,&loca_ipaddr,&loca_port,1); //获取本地IP主机IP地址和端口号
  28.                         while(1)
  29.                         {
  30.                                        
  31.                                 if((recv_err = netconn_recv(tcp_clientconn,&recvbuf)) == ERR_OK)  //接收到数据
  32.                                 {        
  33.                                         OS_ENTER_CRITICAL(); //关中断
  34.                                         memset(tcp_client_recvbuf,0,TCP_CLIENT_RX_BUFSIZE);  //数据接收缓冲区清零
  35.                                         for(q=recvbuf->p;q!=NULL;q=q->next)  //遍历完整个pbuf链表
  36.                                         {
  37.                                                 if(q->len > (TCP_CLIENT_RX_BUFSIZE-data_len)) memcpy(tcp_client_recvbuf+data_len,q->payload,(TCP_CLIENT_RX_BUFSIZE-data_len));//拷贝数据
  38.                                                 else memcpy(tcp_client_recvbuf+data_len,q->payload,q->len);
  39.                                                 data_len += q->len;         
  40.                                                 if(data_len > TCP_CLIENT_RX_BUFSIZE) break; //超出TCP客户端接收数组,跳出        
  41.                                         }
  42.                                         OS_EXIT_CRITICAL();  //开中断
  43.                                         data_len=0;  //复制完成后data_len要清零。
  44.                                         if((tcp_client_flag & LWIP_SEND_DATA) == LWIP_SEND_DATA) //有数据要发送
  45.                                         {
  46.                                         err2 = netconn_write(tcp_clientconn1 ,tcp_client_recvbuf,strlen((char*)tcp_client_recvbuf),NETCONN_COPY); //发送tcp_client_recvbuf中的数据
  47.                                         tcp_client_flag &= ~LWIP_SEND_DATA;
  48.                                         }                                       
  49.                                         netbuf_delete(recvbuf);
  50.                                 }else if(recv_err == ERR_CLSD)  //关闭连接
  51.                                 {
  52.                                         netconn_close(tcp_clientconn);
  53.                                         netconn_delete(tcp_clientconn);
  54.                                         break;
  55.                                 }
  56.                         }
  57.                 }
  58.         }
  59. }

有没有谁做过类似的例程的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

2

帖子

0

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

2

主题

2

帖子

0

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