C-原始LWIP将TCP传输发送到静态IP



我有TCP Echo示例在我的硬件上运行良好,昨天弄清楚了如何使UDP广播工作。经过进一步的思考,我已经意识到,我真正需要的是能够设置与静态IP的TCP连接,其想法是我的硬件可以连接到某种服务器,然后为所有连接使用该连接它的交易。不同之处在于,尽管回声示例设置了一个被动连接,该连接与传入源结合(我理解(,但我想故意启动连接到已知的IP。

根据我在此处的Wikia上发现的内容

我试图作为基本情况,以实现可以将数据包发送到定义的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值。ERR回来了,但是在Wireshark上看不到数据包。我的设置是我的Hardare,也是我的PC以孤立的方式连接到路由器。本地PC的IP地址为12.12.12.43

我在这里错过了一步吗?

tcp_write((函数将失败并返回err_mem,如果:

  1. 数据的长度超过了当前发送缓冲区大小。
  2. 外向节的队列的长度大于lwipopts.h中定义的上限。

可以使用TCP_SNDBUF((函数检索输出队列中可用的字节数。

潜在解决方案:

  1. 再试一次,但发送更少的数据。
  2. 监视发送缓冲区中可用的空间量,仅在发送缓冲区中可用空间时仅发送(更多(数据。

建议:

TCP_SND_BUF((可用于找出可用的发送缓冲区空间。

tcp_sent((可以使用回调函数实现,当发送黄油空间可用时,这将被调用。

最新更新