原始LWIP向静态IP发送TCP传输

原始LWIP向静态IP发送TCP传输,c,tcp,embedded,packet,lwip,C,Tcp,Embedded,Packet,Lwip,我已经让TCP Echo示例在我的硬件上运行得很好,昨天我就知道了如何让UDP广播工作。经过进一步思考,我意识到我真正需要的是能够建立一个到静态IP的TCP连接,这个想法是我的硬件可以连接到某种类型的服务器,然后使用该连接进行所有事务。不同之处在于,尽管echo示例设置了一个被动连接,该连接与传入源绑定(据我所知),但我希望有意地启动到已知IP的连接 根据我在维基上找到的 作为基本情况,我尝试实现一个可以将数据包发送到已定义IP的函数。我只是想发送一个数据包到我的电脑,我正在Wireshark上

我已经让TCP Echo示例在我的硬件上运行得很好,昨天我就知道了如何让UDP广播工作。经过进一步思考,我意识到我真正需要的是能够建立一个到静态IP的TCP连接,这个想法是我的硬件可以连接到某种类型的服务器,然后使用该连接进行所有事务。不同之处在于,尽管echo示例设置了一个被动连接,该连接与传入源绑定(据我所知),但我希望有意地启动到已知IP的连接

根据我在维基上找到的

作为基本情况,我尝试实现一个可以将数据包发送到已定义IP的函数。我只是想发送一个数据包到我的电脑,我正在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本地IP地址为12.12.12.43

我是否遗漏了一个步骤?

如果出现以下情况,tcp\u write()函数将失败并返回ERR\u MEM:

  • 数据长度超过当前发送缓冲区大小
  • 传出段的队列长度大于lwipopts.h中定义的上限 可以使用tcp_sndbuf()函数检索输出队列中可用的字节数

    潜在解决方案:

  • 请重试,但发送的数据较少
  • 监视发送缓冲区中的可用空间量,只有在发送缓冲区中有可用空间时才发送(更多)数据
  • 建议:

    tcp_snd_buf()可用于确定有多少发送缓冲区空间可用


    tcp_sent()可以通过回调函数实现,当发送空间可用时将调用回调函数

    因此,假设tcp_bind()调用失败。你怎么知道?@MahonriMoriancumer事实上,绑定没有失败,我从tcp写入中得到了一个错误。你知道是什么引起的吗。。。很好的用户名。我想说明一点。问题代码没有错误处理。因此,试图诊断发生了什么是困难的。当前,该代码仅在tcp_output()返回时指示错误。我建议对问题代码进行编辑,以更好地显示每个调用是否成功;然后是您遇到错误的地方。换句话说,获得答案可能需要对问题代码进行编辑,以显示tcp_write()之前的所有函数都已成功,并且tcp_write返回了特定错误(ERR_MEM)。