首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >原始LWIP将TCP传输发送给静态IP

原始LWIP将TCP传输发送给静态IP
EN

Stack Overflow用户
提问于 2017-06-07 21:48:31
回答 1查看 5.4K关注 0票数 1

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

基于我在维基百科上的发现,这里

我试图作为一个基本案例来实现一个函数,该函数可以将数据包发送到定义的IP。我只是想发送一个包到我的电脑,我正在寻找它的Wireshark。

代码语言:javascript
复制
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上没有看到数据包。我的设置是我的硬体,以及我的电脑连接到路由器的一个孤立的方式。本地电脑的IP地址为12.12.12.43

我是不是错过了一步?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-08 21:53:12

如果以下情况,tcp_write()函数将失败并返回ERR_MEM:

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

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

潜在解决办法:

  1. 再试一次,但发送的数据较少。
  2. 监视发送缓冲区中可用的空间大小,只有在发送缓冲区中有可用空间时才发送(更多)数据。

建议:

可以使用tcp_snd_buf()来找出可用的发送缓冲区空间。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44423345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档