OpenEdv-开源电子网

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

stm32+lwip作为tcp客户端无法连接到服务器!!!

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
25
金钱
25
注册时间
2012-5-4
在线时间
0 小时
发表于 2012-5-4 13:46:17 | 显示全部楼层 |阅读模式

我的stm32107+lwip作为tcp服务器端可以跟pc客户端正常通信,而如果作为tcp客户端则无法连接到pc服务器。这是哪里出了问题啊?希望有这方面经验的指导一下小弟,先谢谢了!
代码如下:
#include "lwip/tcp.h"
#include "lwip/ip_addr.h"
#include <string.h>

#define GREETING "Hello. \r\n"
#define HELLO "Hello "
#define MAX_NAME_SIZE 32

struct name
{
  int length;
  char bytes[MAX_NAME_SIZE];
};
void tcp_client_init(void);
err_t tcp_client_connect(void *arg, struct tcp_pcb *pcb, err_t err);
static void tcpaa_conn_err(void *arg, err_t err);
static err_t tcpaa_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err);


static err_t tcpaa_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
{
 tcp_write(pcb, GREETING, strlen(GREETING), 1);
   return ERR_OK;

}

void tcp_client_init(void)
{
   err_t ret;
   struct tcp_pcb *pcb=NULL;

   IP4_ADDR(&client_addr, 192, 168, 0, 192); 
   IP4_ADDR(&server_addr, 192, 168, 0, 32);

   /* Create a new TCP control block  */
   pcb = tcp_new();

 if(pcb!=NULL)
 {
    /* Assign to the new pcb a local IP address and a port number */
    tcp_bind(pcb, &client_addr, 1010);//客户端端口号为33

    //注册连接出错处理函数
    tcp_err(pcb, tcpaa_conn_err); //hrz

    tcp_recv(pcb, tcpaa_recv);//接收到数据的回调函数设置

    /* Connect to the server: send the SYN */
    ret=tcp_connect(pcb, &server_addr, 1010, tcp_client_connect);//服务器端口号为25
 }          
}
err_t tcp_client_connect(void *arg, struct tcp_pcb *pcb, err_t err)
{
 tcp_arg(pcb, mem_calloc(sizeof(struct name), 1));

 tcp_recv(pcb, tcpaa_recv);//接收到数据的回调函数设置

 tcp_write(pcb, GREETING, strlen(GREETING), 1);

   return ERR_OK;
}

static void tcpaa_conn_err(void *arg, err_t err)
{
  struct name *name;
  name = (struct name *)arg;

  mem_free(name);

  while(1);
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

4

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2017-12-1
在线时间
7 小时
发表于 2020-3-24 15:33:50 | 显示全部楼层
关闭PC防火墙,原因是PC机的windows防火墙拒绝了lwIP的TCP连接请求
回复 支持 2 反对 0

使用道具 举报

21

主题

124

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
260
金钱
260
注册时间
2013-1-10
在线时间
10 小时
发表于 2016-4-21 14:41:41 | 显示全部楼层
void TCP_Client_Init()
{
  struct tcp_pcb *Clipcb;
  struct ip_addr ipaddr;
  u8 ret;
        struct ip_addr serverip;           //目标机IP  
        static unsigned short serverport;       //目标机端口号  

        serverip.addr = htonl(0xC0A8019A);       //192.168.1.154
        serverport=20002;  
        Clipcb = tcp_new();                       // 建立通信的TCP控制块(Clipcb)

        tcp_bind(Clipcb,IP_ADDR_ANY,20002);       // 绑定本地IP地址和端口号

        iris_pcb=Clipcb;  //the mathod is wrong //by iris 2013.6.3
        //tcp_recv
        ret= tcp_connect(Clipcb,&serverip,20002,TcpCli_Connected_callback);
   tcp_recv(iris_pcb,tcp_recv_fn recv);
        if(ret==ERR_OK)
        Debugout(0,"connect oko tcp");
        //tcp_recv(iris_pcb,TcpCli_Received_callback);


}
个人博客www.xiaovdiy.cn
https://shop100764513.taobao.com/
回复 支持 0 反对 1

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2012-5-4 17:37:15 | 显示全部楼层
没玩过...
回复 支持 反对

使用道具 举报

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2011-1-15
在线时间
0 小时
发表于 2012-7-28 13:42:37 | 显示全部楼层
谁在在做STM32F407关于网络通信的东西啊,一起讨论啊,我的QQ:253416737
回复 支持 反对

使用道具 举报

11

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2012-10-12
在线时间
3 小时
发表于 2012-12-27 09:49:34 | 显示全部楼层
回复【楼主位】hrz2ml:
---------------------------------
悲剧啊,我也碰上这个问题了。。。
新人求指导~~~
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2012-9-21
在线时间
0 小时
发表于 2013-5-6 21:01:37 | 显示全部楼层
楼主的问题,解决没?我用STM32F107+Lwip,遇到了同样的问题,求指点
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2013-7-30
在线时间
3 小时
发表于 2013-7-30 16:09:13 | 显示全部楼层
我最近也在搞stm32f107+LWIP作为TCP客户端,发现使用ST公司提供的测试软件和LwIP应用指南 V0.01.pdf这个文章里面提到的软件,都可以测试成功。但使用正常的window API接口实现的程序,一连接上服务器就马上断开了。后来使用科来分析软件看了下,结果发现:在TCP的第三次握手那里,客户端这边不仅仅是发了ACK,还发了数据。 
在调用函数:tcp_connect(pcb, &server_addr, 1010, tcp_client_connect); 如果在tcp_client_connect函数里面使用了 tcp_write(pcb, GREETING, strlen(GREETING), 1);就会出现这种情况,导致TCP的state为SYNC,而不是establish。
回复 支持 反对

使用道具 举报

头像被屏蔽

88

主题

231

帖子

2

精华

高级会员

Rank: 4

积分
844
金钱
844
注册时间
2013-4-11
在线时间
40 小时
发表于 2013-7-30 17:46:40 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

48

主题

167

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
380
金钱
380
注册时间
2013-6-27
在线时间
17 小时
发表于 2013-8-1 10:09:33 | 显示全部楼层
回复【7楼】aa421701136:
---------------------------------
我在做103+ENC28J60+LWIP+DHCP,之前这样103+ENC28J60+LWIP可以同时实现client 和server,现在加上DHCP,成功分配IP后,server功能能行,但client却connect不上;我在tcp_connect(client_pcb, &destip, 1206, tcp_client_connected);中调用的tcp_client_connected里面有用tcp_write,并没有你所说的连上断的现象。而且这个返回值也是ERR_OK,成功调用tcp_output,pcb->state == SYN_SENT;
  ret = tcp_enqueue(pcb, NULL, 0, TCP_SYN, 0, TF_SEG_OPTS_MSS
#if LWIP_TCP_TIMESTAMPS
                    | TF_SEG_OPTS_TS
#endif);

调试发现,tcp_output,输出调试信息nothing to send

回复 支持 反对

使用道具 举报

48

主题

167

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
380
金钱
380
注册时间
2013-6-27
在线时间
17 小时
发表于 2013-8-1 11:14:56 | 显示全部楼层
这个问题会是网卡设置的问题么,进入SYN_SENT后,就待ACK,可是跟踪发现,网卡并没接收到包,这个原因是什么呢,是SERVER没发包,还是网卡没收到。
回复 支持 反对

使用道具 举报

48

主题

167

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
380
金钱
380
注册时间
2013-6-27
在线时间
17 小时
发表于 2013-8-2 10:19:06 | 显示全部楼层
回复【8楼】nonplus:
---------------------------------
你有没有遇到connect不上的问题呢,怎么解决。
之前没加DHCP,能成功的连上,无论是用作CLIENT还是SERVER都能通过路由和PC连上,两个功能同时运行也可以,用的TCP&UDP测试工具。
现在在原代码的基础上加上DHCP功能(代码改动很小,client和server相关的代码就没改,只#define LWIP_DHCP 1和在netconfig.c里加上dhcp_start),
现在能成功分配IP,能够PING通,用做server时,能成功连上,但是,做client时,连不上了。tcp_connect内调用的tcp_enqueue的返回值也是ERR_OK,并成功调用tcp_output。现在是问题出在哪儿都不知道。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2013-8-13
在线时间
0 小时
发表于 2013-8-13 19:01:05 | 显示全部楼层
我也在弄stm32+lwip来实现tcp的client,也遇到上面的问题,有人解决了?求指教啊
回复 支持 反对

使用道具 举报

Yanxp 该用户已被删除
发表于 2013-8-14 09:38:07 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Yanxp 该用户已被删除
发表于 2013-8-14 09:44:06 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2013-8-17
在线时间
0 小时
发表于 2013-8-17 16:41:07 | 显示全部楼层
我也写了个STM32F107+LWIP客户端程序,用RawAPI在connected中调用tcp_write,服务器用TCP/UDP测试工具,发现一个不正常的地方就是:在connected用tcp_writ输出的内容服务器收不到。其他的收发都正常,感觉很迷惑。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2013-9-27
在线时间
0 小时
发表于 2013-9-27 11:10:51 | 显示全部楼层
我现在也遇到这个问题了,请问你解决了没,能把你的解决方案说一下吗
回复 支持 反对

使用道具 举报

27

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2012-4-4
在线时间
46 小时
发表于 2014-3-26 15:15:59 | 显示全部楼层
请在tcp_write(pcb, GREETING, strlen(GREETING), 1);后加一句pbuf_free(p);
static err_t tcpaa_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
{
  tcp_write(pcb, GREETING, strlen(GREETING), 1);
pbuf_free(p);
   return ERR_OK;

}
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2014-9-2
在线时间
0 小时
发表于 2014-9-2 13:58:25 | 显示全部楼层
回复【11楼】can123dao:
---------------------------------
我也遇到client端连不上pc的问题,可以交流下。qq531486448
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2014-9-2
在线时间
0 小时
发表于 2014-9-2 14:01:44 | 显示全部楼层
回复【18楼】molin2015:
---------------------------------
还有人遇到类似问题吗。我的是作为服务端都正常,客户端不正常啊。tcp_connect返回ok,可是pc收不到syn包。强制pcb-》state=established,之后tcp_write 也抓不到包。总之就是作为客户端。没有抓到任何包
回复 支持 反对

使用道具 举报

93

主题

745

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1843
金钱
1843
注册时间
2012-9-16
在线时间
285 小时
发表于 2014-9-2 14:25:43 | 显示全部楼层
struct tcp_pcb *pcb=NULL;

   IP4_ADDR(&client_addr, 192, 168, 0, 192); 
   IP4_ADDR(&server_addr, 192, 168, 0, 32);

   /* Create a new TCP control block  */
   pcb = tcp_new();

 if(pcb!=NULL)
 {
    /* Assign to the new pcb a local IP address and a port number */
    tcp_bind(pcb, &client_addr, 1010);//客户端端口号为33

    //注册连接出错处理函数
    tcp_err(pcb, tcpaa_conn_err); //hrz

    tcp_recv(pcb, tcpaa_recv);//接收到数据的回调函数设置

    /* Connect to the server: send the SYN */
    ret=tcp_connect(pcb, &server_addr, 1010, tcp_client_connect);//服务器端口号为25
 }  
这是两个线程,客户端和服务器端分开初始化?
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复 支持 反对

使用道具 举报

3

主题

7

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2014-9-2
在线时间
0 小时
发表于 2014-9-2 21:59:56 | 显示全部楼层
求交流这个通讯的知识   q327413510
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2015-4-2
在线时间
0 小时
发表于 2015-4-9 11:40:44 | 显示全部楼层
回复【21楼】知嗅:
---------------------------------
请问你现在关于这个以太网通信有进展么
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2015-4-2
在线时间
0 小时
发表于 2015-4-9 11:41:34 | 显示全部楼层
回复【7楼】aa421701136:
---------------------------------
请问你现在作为客户端程序成功了么?可否分享一下经验
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2019-5-21
在线时间
18 小时
发表于 2020-4-24 13:33:11 | 显示全部楼层
can123dao 发表于 2013-8-2 10:19
回复【8楼】nonplus:
---------------------------------
你有没有遇到connect不上的问题呢,怎么解决。
之 ...

你好,我也遇上跟你一样的问题,请问你的解决了吗
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2019-5-21
在线时间
18 小时
发表于 2020-4-24 13:35:03 | 显示全部楼层
aa421701136 发表于 2013-7-30 16:09
**** 作者被禁止或删除 内容自动屏蔽 ****

你好,请问你的问题解决了吗?我碰上一样的问题了。找不到原因
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2020-4-21
在线时间
5 小时
发表于 2020-7-8 09:33:12 | 显示全部楼层
25楼说的关闭防火墙,解决了
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2020-7-28
在线时间
4 小时
发表于 2020-9-23 16:03:41 | 显示全部楼层
今天我也遇到了,结果搞了半天是防火墙的问题,关闭防火墙就可以接通了
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2017-7-16
在线时间
7 小时
发表于 2021-3-5 15:05:33 | 显示全部楼层
zy820 发表于 2020-3-24 15:33
关闭PC防火墙,原因是PC机的windows防火墙拒绝了lwIP的TCP连接请求

谢谢大佬,你的方法就是正确的。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 15:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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