【发布时间】: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);
(如果您需要查看更完整的示例,我可以在明天发布。)
【问题讨论】: