gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:50:36 25 4
gpt4 key购买 nike

我的 TCP Echo 示例在我的硬件上运行良好,并且昨天想出了如何让 UDP 广播正常工作。经过进一步思考,我意识到我真正需要的是能够建立到静态 IP 的 TCP 连接,我的想法是我的硬件可以连接到某种服务器,然后为所有服务器使用该连接其交易。不同之处在于,虽然 echo 示例设置了一个被动连接,它与传入源绑定(bind)(据我所知),但我想有意启动与已知 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() 函数将失败并返回 ERR_MEM:

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

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

可能的解决方案:

  1. 重试但发送较少的数据。
  2. 监控发送缓冲区中的可用空间量,并仅在发送缓冲区中有可用空间时才发送(更多)数据。

建议:

tcp_snd_buf() 可用于查明有多少发送缓冲区空间可用。

tcp_sent() 可以用回调函数实现,当发送缓冲空间可用时调用。

关于c - 原始 LWIP 将 TCP 传输发送到静态 IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44423345/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com