UDP数据包没有发送?

时间:2018-05-17 01:59:27

标签: sockets udp ppp

我有一个简单的C程序绑定套接字,以便它可以 接收和发送UDP数据包。它使用recvfrom来接收数据包,以及 收到一个后不久,它构建并发送回复 数据包,以明显的方式使用sendto,发送到同一个数据包 recvfrom报告的地址和端口。

该程序在初始测试中完美运行,当时 数据包通过常规以太网进出 接口,eth0。但现在我试图通过PPP使用它 interface,ppp0,由于某种原因,它无法正常工作。

sendto未报告任何错误,但未显示tcpdump 包出去了。 (显示数据包进入,所以 我非常确定tcpdump正在运行。)

我现有的程序基本上都是一样的 在所有情况下,它在所有情况下都能正常工作 接口。我还没有弄清楚现有的计划如何 可能是设置其套接字或其发送/接收逻辑 不同的是,它允许它在我新的,更简单的程序中工作 失败。

有些数据包很大(接近MTU),但很多 它们很小(<100字节),而且都没有 通过,所以我不认为这是一个MTU问题。

任何人都可以想到会导致发送数据包失败的任何事情 这样出去? (我并不是说它与ppp有任何关系;它在ppp下失败对我来说可能是巧合,或者它可能是问题的关键部分。)

抱歉,我无法发布实际代码;它在工作,我在家里。 相关部分看起来像这样:

struct sockaddr_in addr;
socklen_t addrlen = sizeof(addr);
char buf[1600];
int r, r2;

r = recvfrom(sock, buf, sizeof(buf), 0, (struct sockaddr *)&addr, &addrlen);

/* ... */

r2 = sendto(sock, buf2, n2, 0, (struct sockaddr *)&addr, addrlen);

(如果您需要查看更完整的示例,我明天可以发布。)

1 个答案:

答案 0 :(得分:0)

如果没有流量工作:

可能存在路由问题。检查主机的路由表。

您还可以使用tcpdump检查流量是否通过错误的接口传出。例如:

如果您希望通过命令看到ppp0中的流量:

  

tcpdump -i ppp0 udp port 123

并且您没有看到所需的流量,然后通过类似的命令检查其他接口,以确保流量不会通过错误的接口传出:

  

tcpdump -i eth0 udp port 123

如果部分流量有效:

如果您使用的是某些移动网络(通常通过ppp0使用),那么您的上行速度可能比下行速度慢。

因此,客户端可以向您的服务器发送更多流量(通过下行链路),而不是上行链路能够传输。

由于UDP没有像TCP这样的可靠性和拥塞/流量控制,UDP可以在过载情况下丢弃一些数据包。