OpenEdv-开源电子网

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

RTT-lwip加了dhcp,tcp connect连接不上

[复制链接]

1

主题

4

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2015-6-23
在线时间
4 小时
发表于 2016-8-24 16:50:10 | 显示全部楼层 |阅读模式
10金钱


  各位大神好:

   小弟在RT-thread 下创建一个简单的tcp客户端程序,用的是RTT自带的STM32F107程序,网络芯片是DP83848;
   代码如下:

void rt_tcp_client_thread_entry(void* parameter)
{
        ALIGN(4)
       static const char send_data[] = "this is tcp client from rt-thread.";

        char *recv_data;
        int sock;
        const char server_ip_str[16]="192.168.0.101";  
        uint16_t port = 8080;
       
        struct hostent *host;
        struct in_addr my_ipaddr;  
        struct sockaddr_in my_sockaddr;  
       
        int conn;
        recv_data = rt_malloc(1024);
        if(recv_data == RT_NULL)
        {
                 rt_kprintf("no memory\n");
                 return;
        }
       
        host = gethostbyname(server_ip_str);  
        my_ipaddr.s_addr = *(unsigned long *) host->h_addr_list[0];  
        rt_kprintf("your IP Address:%s\r\n" , inet_ntoa(my_ipaddr));  
       
        my_sockaddr.sin_family = AF_INET;  
        my_sockaddr.sin_port = htons(port);  
        my_sockaddr.sin_addr = my_ipaddr;  
        rt_memset(&(my_sockaddr.sin_zero), 0, sizeof(my_sockaddr.sin_zero));  
       
        sock = socket(AF_INET, SOCK_STREAM, 0);
        rt_kprintf("sock = %d\n",sock);
       
        if ( sock == -1 )  
        {  
                rt_kprintf("Socket error\n");  
                rt_free(recv_data);  
                return;  
        }
       
        conn =  lwip_connect(sock, (struct sockaddr *)&my_sockaddr, sizeof(struct sockaddr));
        rt_kprintf("conn = %d\n",conn);         if ( conn == -1)  
        {  
                rt_kprintf("Connect fail!\n");  
                lwip_close(sock);  
                rt_free(recv_data);  
                return;  
        }           
       
        while(1)
        {               
                                send(sock,send_data,strlen(send_data), 0);                               
                //                closesocket(sock);  
        rt_thread_delay( 500);                
        }
}
   lwip_connect 这个一直返回的是-1,打断点调试sock = 0;


调试进 lwip_connect 进去,
int
lwip_connect(int s, const struct sockaddr *name, socklen_t namelen)
{
  struct lwip_sock *sock;
  err_t err;
  const struct sockaddr_in *name_in;

  sock = get_socket(s);   
  if (!sock) {
    return -1;

。。。。
  }

   一直返回-1,死在get_socket这个了,这个S传进去是0,但是里面
static struct lwip_sock *
get_socket(int s)
{
  struct lwip_sock *sock;

  if ((s < 0) || (s >= NUM_SOCKETS)) {
    LWIP_DEBUGF(SOCKETS_DEBUG, ("get_socket(%d): invalid\n", s));
    set_errno(EBADF);
    return NULL;
  } 直接反馈NULL;


  代码中使能了 RT_LWIP_DHCP;
如果代码不使能 RT_LWIP_DHCP,那么是可以连接上服务器的,但是加了 RT_LWIP_DHCP,一直反馈connect fail,不知道为什么


哪位大哥知道的,指点下,到底哪儿出错了,谢谢!

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

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2015-6-23
在线时间
4 小时
 楼主| 发表于 2016-8-24 16:54:43 | 显示全部楼层
软件跑起来后,分配的地址103,我在电脑上ping 192.168.0.103 是可以ping通的,也就是地址是分配了,但是connect..出问题
回复

使用道具 举报

11

主题

1041

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3696
金钱
3696
注册时间
2011-5-23
在线时间
2008 小时
发表于 2016-8-24 17:21:19 | 显示全部楼层
本帖最后由 aozima 于 2016-8-24 17:24 编辑

先看下当前网络状态
[mw_shl_code=c,true]finsh>>list_if()[/mw_shl_code]
然后板子上面和PC上面都开启数据抓包。
RT-Thread RTOS 音频,WIFI,蓝牙
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2015-6-23
在线时间
4 小时
 楼主| 发表于 2016-8-24 21:08:17 | 显示全部楼层
到connect那进去,sock传进去等于0,然后进入connect函数int
lwip_connect(int s, const struct sockaddr *name, socklen_t namelen)
{
  struct lwip_sock *sock;
  err_t err;
  const struct sockaddr_in *name_in;

        rt_kprintf("s = %d\n",s);  //test
       
  sock = get_socket(s);    0进去,返回的NULL,我看了下,并不满足条件,不知道什么原因;
  if (!sock) {
    return -1;
。。。
  }


static struct lwip_sock *
get_socket(int s)
{
  struct lwip_sock *sock;

  if ((s < 0) || (s >= NUM_SOCKETS)) {           S= 0,NUM_SOCKETS =4 ,怎么会进去?????
    LWIP_DEBUGF(SOCKETS_DEBUG, ("get_socket(%d): invalid\n", s));
    set_errno(EBADF);
    return NULL;
  }

list_if()

list_if()
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2015-6-23
在线时间
4 小时
 楼主| 发表于 2016-8-24 21:12:48 | 显示全部楼层
用wireshark 抓106发过来的包,一包也没有
回复

使用道具 举报

10

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2017-3-2
在线时间
51 小时
发表于 2017-10-15 14:49:36 | 显示全部楼层
我也遇到同样的问题,楼主解决了吗?解决了可以分享一下吗?
回复

使用道具 举报

27

主题

427

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
4356
金钱
4356
注册时间
2017-5-30
在线时间
578 小时
发表于 2018-2-9 17:10:11 | 显示全部楼层
kdo 发表于 2017-10-15 14:49
我也遇到同样的问题,楼主解决了吗?解决了可以分享一下吗?

您解决了吗
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 21:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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