原始 LWIP 将 TCP 传输发送到静态 IP
Raw LWIP Send TCP Transmission to Static IP
我的 TCP Echo 示例在我的硬件上运行良好,并且昨天弄清楚了如何让 UDP 广播工作。经过进一步思考,我意识到我真正需要的是能够建立到静态 IP 的 TCP 连接,我的想法是我的硬件可以连接到某种服务器,然后为所有服务器使用该连接其交易。不同之处在于,虽然 echo 示例设置了一个被动连接,它与传入源绑定(据我所知),但我想故意启动与已知 IP 的连接。
基于我在 Wikia Here 上找到的内容 Here
我已经尝试作为一个基本案例来实现一个可以将数据包发送到定义的 IP 的功能。我只是想向我的 PC 发送一个数据包,我正在 Wireshark 上寻找它。
void echo_tx_tcp()
{
err_t wr_err = ERR_OK;
struct tcp_pcb *l_tcp_pcb;
l_tcp_pcb = tcp_new();
ip_addr_t dest_ip =
{ ((u32_t)0x0C0C0C2BUL) };
wr_err = tcp_bind(l_tcp_pcb, &dest_ip, 12);
wr_err = tcp_connect(l_tcp_pcb, &dest_ip, 12, echo_accept);
tcp_sent(l_tcp_pcb, echo_sent);
struct pbuf *p = pbuf_alloc(PBUF_TRANSPORT, 1024, PBUF_RAM);
unsigned char buffer_send[1024] = "My Name Is TCP";
p->payload = buffer_send;
p->len = 1024;
p->tot_len = 1024;
wr_err = tcp_write(l_tcp_pcb, p->payload, p->len, 1);
wr_err = tcp_output(l_tcp_pcb);
if(wr_err == ERR_OK)
{
p->len++;
}
return;
}
最后一个 if 语句存在,以便我可以使用调试器检查 wr_err 值。错误正常返回,但在 wireshark 上看不到数据包。我的设置是我的硬件以及我的 PC 以隔离方式连接到路由器。本地PC的IP地址为12.12.12.43
我是不是漏掉了一步?
tcp_write() 函数将失败并且 return ERR_MEM 如果:
- 数据长度超过当前发送缓冲区大小。
- 出局队列长度大于lwipopts.h中定义的上限。
可以使用 tcp_sndbuf() 函数检索输出队列中可用的字节数。
可能的解决方案:
- 重试但发送较少的数据。
- 监控发送缓冲区中可用的 space 数量,仅当发送缓冲区中有 space 可用时才发送(更多)数据。
建议:
tcp_snd_buf() 可用于找出有多少发送缓冲区 space 可用。
tcp_sent()可以用回调函数实现,当发送按钮space可用时调用。
我的 TCP Echo 示例在我的硬件上运行良好,并且昨天弄清楚了如何让 UDP 广播工作。经过进一步思考,我意识到我真正需要的是能够建立到静态 IP 的 TCP 连接,我的想法是我的硬件可以连接到某种服务器,然后为所有服务器使用该连接其交易。不同之处在于,虽然 echo 示例设置了一个被动连接,它与传入源绑定(据我所知),但我想故意启动与已知 IP 的连接。
基于我在 Wikia Here 上找到的内容 Here
我已经尝试作为一个基本案例来实现一个可以将数据包发送到定义的 IP 的功能。我只是想向我的 PC 发送一个数据包,我正在 Wireshark 上寻找它。
void echo_tx_tcp()
{
err_t wr_err = ERR_OK;
struct tcp_pcb *l_tcp_pcb;
l_tcp_pcb = tcp_new();
ip_addr_t dest_ip =
{ ((u32_t)0x0C0C0C2BUL) };
wr_err = tcp_bind(l_tcp_pcb, &dest_ip, 12);
wr_err = tcp_connect(l_tcp_pcb, &dest_ip, 12, echo_accept);
tcp_sent(l_tcp_pcb, echo_sent);
struct pbuf *p = pbuf_alloc(PBUF_TRANSPORT, 1024, PBUF_RAM);
unsigned char buffer_send[1024] = "My Name Is TCP";
p->payload = buffer_send;
p->len = 1024;
p->tot_len = 1024;
wr_err = tcp_write(l_tcp_pcb, p->payload, p->len, 1);
wr_err = tcp_output(l_tcp_pcb);
if(wr_err == ERR_OK)
{
p->len++;
}
return;
}
最后一个 if 语句存在,以便我可以使用调试器检查 wr_err 值。错误正常返回,但在 wireshark 上看不到数据包。我的设置是我的硬件以及我的 PC 以隔离方式连接到路由器。本地PC的IP地址为12.12.12.43
我是不是漏掉了一步?
tcp_write() 函数将失败并且 return ERR_MEM 如果:
- 数据长度超过当前发送缓冲区大小。
- 出局队列长度大于lwipopts.h中定义的上限。
可以使用 tcp_sndbuf() 函数检索输出队列中可用的字节数。
可能的解决方案:
- 重试但发送较少的数据。
- 监控发送缓冲区中可用的 space 数量,仅当发送缓冲区中有 space 可用时才发送(更多)数据。
建议:
tcp_snd_buf() 可用于找出有多少发送缓冲区 space 可用。
tcp_sent()可以用回调函数实现,当发送按钮space可用时调用。