【问题标题】:UDP packets not sending?UDP数据包不发送?
【发布时间】:2018-05-17 01:59:27
【问题描述】:

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

这个程序在初始测试中运行良好,当 数据包通过常规以太网进出 接口,eth0。但现在我正试图通过 PPP 使用它 接口,ppp0,由于某种原因它不起作用。

sendto 没有报告任何错误,但是 tcpdump 没有显示 数据包出去。 (它显示了进来的数据包,所以 我很确定 tcpdump 工作正常。)

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

有些数据包很大(接近 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);

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

【问题讨论】:

    标签: sockets udp ppp


    【解决方案1】:

    如果没有流量:

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

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

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

    tcpdump -i ppp0 udp 端口​​ 123

    而你没有看到想要的流量,然后通过类似的命令检查其他接口,以确保流量不会通过错误的接口出去:

    tcpdump -i eth0 udp 端口​​ 123

    如果部分流量有效:

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

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

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

    【讨论】:

    • 感谢您的建议。使用 tcpdump 检查接口使用情况是什么意思?我不熟悉这种技术。
    • @Steve Summit:答案中添加了示例。没什么神奇的,也许你已经做到了。
    猜你喜欢
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多