首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >lwip初始化网络接口

lwip初始化网络接口
EN

Stack Overflow用户
提问于 2014-07-02 21:58:30
回答 1查看 2K关注 0票数 2

日安!

我想做一个客户端,并将它连接到netcat简单服务器。

1)使用默认设置和#define's (唯一的东西-我在上面设置了一些调试信息)编译lib 2)将lib链接到项目(工作正常) 3)使用ubuntu设置虚拟机,并使netcat与

代码语言:javascript
复制
~$ sudo netcat -l -v 7 

这意味着我们正在监听端口7(7)。

代码语言:javascript
复制
Now I use ifconfig and get
inet addr:172.17.9.71 
Bcast:172.17.11.255 
Mask:255.255.252.0 

现在还可以。

4) ping和telnet工作正常-我发现netcat可以通过它们访问。

我的ifconfig统计数据是

代码语言:javascript
复制
inet addr:172.17.9.165 
Bcast:172.17.11.255 
Mask:255.255.252.0 

5)现在我正在尝试用我的客户端连接到netcat服务器,使用lwip编写的输出是:

代码语言:javascript
复制
LWIP_HAVE_LOOPIF = 0 
LWIP_HAVE_LOOPIF = 0 
tcp_bind: bind to port 55555 
tcp_connect to port 7 
netif_default =  -780756800 
netif_is_up(netif_default) =  0 
ip_route: No route to 172.17.9.71 
connect err =  -4 
netif_default =  -780756800 
netif_is_up(netif_default) =  0 
ip_route: No route to 172.17.9.71 
ip_output: No route to 172.17.9.71 
Assertion "mem_free: mem->used" failed at line 339 in ../../../../../lwip/src/core/mem.c 

完整列表:

代码语言:javascript
复制
const char *helloworld = "hello world\n"; 



void hello_end(struct tcp_pcb *pcb, u8_t *state) 
{ 
 tcp_err(pcb, NULL); 
 tcp_recv(pcb, NULL); 
 tcp_sent(pcb, NULL); 
 tcp_poll(pcb, NULL, 0); 
 mem_free(state); 
} 
err_t hello_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) 
{ 
 u8_t *state = (u8_t *)arg; 
 u16_t len; 

 if (p == NULL) 
 if (*state == 255) /* close send */ 
 hello_end(pcb, state); 
 else /* close not yet send */ 
 *state |= 2; 
 else 
  { 
 len = p->tot_len; 
 pbuf_free(p); 
 tcp_recved(pcb, len); 
 } 

 return ERR_OK; 
} 

void hello_err(void *arg, err_t err) 
{ 
 mem_free(arg); 
} 

err_t hello_poll_close(void *arg, struct tcp_pcb *pcb) 
{ 
 u8_t *state = (u8_t *)arg; 

 if (tcp_close(pcb) == ERR_OK) 
 { 
 if ((*state & 2) == 2) /* close received */ 
 hello_end(pcb, state); 
 else /* close not yet received */ 
 *state = 255; 
 } 

 return ERR_OK; 
} 

err_t hello_connected(void *arg, struct tcp_pcb *pcb, err_t err) 
{ 
tcp_write(pcb, helloworld, 12, 0); 
 return ERR_OK; 
} 

err_t hello_connect() { 

    lwip_init(); 
    u8_t *state; 
    err_t err; 
    struct tcp_pcb *pcb; 
    ip_addr_t ipaddr; 

      IP4_ADDR(&ipaddr, 172,17,9,71); 
      if ((state = mem_malloc(1)) == NULL)  { 
         return ERR_MEM; 
      } 

       *state = 1; 
       if ((pcb = tcp_new()) == NULL)  { 
       mem_free(state); 
       return ERR_MEM; 
      } 

      tcp_arg(pcb, state); 
      tcp_err(pcb, hello_err); 
      tcp_recv(pcb, hello_recv); 
      tcp_sent(pcb, NULL); 
      tcp_poll(pcb, hello_poll_close, 10); 





          tcp_bind(pcb,IPADDR_ANY, 55555); //Bind ourselvs to the port 55555 and my own adress 


      err = tcp_connect(pcb, &ipaddr, 7, hello_connected); 
      if (err != ERR_OK)  { 
         std::cout << "connect err =  " << (int)err << std::endl; 
        mem_free(state); 
         tcp_abort(pcb); 
    } 

      getchar(); 
      return ERR_OK; 
} 

int main(int argc, char** argv) { 

     err_t err =  hello_connect(); 
       if (err != ERR_OK)  { 
       std::cout << "2err =  " << err << std::endl; 
       } 
        std::cout << "End of Main" << std::endl; 
        return 0; 


    return 0; 
} 

从这里我开始认为问题是我没有设置NETIF。

但我不知道该怎么做。

我想我不希望lwip默认创建tap0

(它使

代码语言:javascript
复制
tap0      Link encap:Ethernet  HWaddr 86:97:2c:64:b7:78   
          inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0 
          inet6 addr: fe80::8497:2cff:fe64:b778/64 Scope:Link 
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1 
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0 
          TX packets:33 errors:0 dropped:0 overruns:0 carrier:0 
          collisions:0 txqueuelen:500 
          RX bytes:0 (0.0 B)  TX bytes:6555 (6.4 KiB) 

)

我希望将我的应用程序绑定到本地主机或eth1 -无论是什么……我该怎么做呢?我在应用程序中做错了什么?

顺便说一句-当我这样做的时候

代码语言:javascript
复制
char *eth = "eht1"; 
netif_set_default(netif_find(eth)); 

在我的Init函数中,我得到以下输出

代码语言:javascript
复制
WIP_HAVE_LOOPIF = 0 
LWIP_HAVE_LOOPIF = 0 
tcpip_thread: PACKET 0x7f72acaa1988 
ip_input: packet not for us. 
tcp_bind: bind to port 55555 
tcp_connect to port 7 
netif_default =  0 

它落在了

代码语言:javascript
复制
 err = tcp_connect(pcb, &ipaddr, 7, hello_connected); 

(不通过它...)

一些1能帮上忙吗?

EN

回答 1

Stack Overflow用户

发布于 2014-07-03 21:56:33

它是你用来和你的服务器对话的以太网接口吗?在代码的hello_connect()函数中,在初始化lwIP之后,您需要为以太网接口分配和初始化一个'struct netif‘对象,并使用netif_add()将其注册到lwIP。您还需要使用netif_set_default()将其设置为默认接口。我不确定代码的其余部分。为什么不直接使用套接字API呢?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24533089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档