美好的一天!
我想创建一个客户端并将其连接到netcat简单服务器。
1)使用默认设置和#define的压缩lib(唯一的东西 - 我设置了一些调试信息) 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
完整列表:
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)
)
我想将我的应用程序绑定到localhost或eth1 - 无论如何......我该怎么做? 在我的申请中我做错了什么?
顺便说一下 - 当我做的时候
char *eth = "eht1";
netif_set_default(netif_find(eth));
在我的Init函数中,我得到了这个输出
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);
(不通过......)
可以帮助一些吗?
答案 0 :(得分:0)
您是否使用以太网接口与服务器通信?在您的代码的hello_connect()函数中,在初始化lwIP之后,您需要分配并初始化一个&#39; struct netif&#39;用于以太网接口的对象,并使用netif_add()将其注册到lwIP。您还需要将其设置为netif_set_default()的默认接口。 我不确定其余的代码。为什么不直接使用套接字API?