gpt4 book ai didi

tcp - lwip 初始化网络接口(interface)

转载 作者:可可西里 更新时间:2023-11-01 02:43:39 26 4
gpt4 key购买 nike

美好的一天!

我想制作一个客户端并将其连接到 netcat 简单服务器。

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

一起工作
~$ sudo netcat -l -v 7 

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

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 统计数据是

inet addr:172.17.9.165 
Bcast:172.17.11.255
Mask:255.255.252.0

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

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

完整 list :

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

(这使得

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)

)

我想将我的应用程序绑定(bind)到 localhost 或 eth1 - 无论怎样...我该怎么做?我在申请中做错了什么?

顺便说一下,当我这样做的时候

char *eth = "eht1"; 
netif_set_default(netif_find(eth));

在我的初始化函数中我得到了这个输出

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

它落在

 err = tcp_connect(pcb, &ipaddr, 7, hello_connected); 

(没有通过...)

有人能帮忙吗?

最佳答案

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

关于tcp - lwip 初始化网络接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24533089/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com