我正在 macOS 上开发一个跟踪路由程序,该程序使用以下代码(精简)以增加的 TTL 批量发送 UDP 探测
int sd = socket(AF_INET, SOCK_DGRAM, 0);
if (sd < 0) { // error handling }
sockaddr_in saddr;
memset(&saddr, 0, sizeof (saddr));
saddr.sin_family = AF_INET;
saddr.sin_port = htons(port_num);
if (bind(sd, (const sockaddr*)&saddr, sizeof(saddr)) < 0) { // error handling }
for (int i = 1; i <= 5; ++i) {
int ttl = i;
if(setsockopt(sd, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl)) < 0) {
// error handling
}
char probe[64] = {0};
int cc = sendto(sd, probe, sizeof(probe), 0, &dest_addr, sizeof(dest_addr));
if (cc < 0 || cc != sizeof(probe)) {
// error handling
}
}
我希望代码发送 5 个 TTL 为 1 到 5 的数据包,但是,如果我检查 Wireshark 中的网络活动,所有数据包都会以 TTL 设置为 5 的方式发送。
我没有将套接字设置为非阻塞,并且没有任何 API 调用报告任何错误。
像这样在
setsockopt
之间调用 sendto
是不正确的吗?此外,如果我在迭代之间添加 10 毫秒的睡眠,它就会按预期工作。
您需要坚持延迟或关闭并重新打开套接字,因为 ttl 值由
sendto()
异步设置