setsockopt 在循环调用时未设置正确的 IP_TTL

问题描述 投票:0回答:1

我正在 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 毫秒的睡眠,它就会按预期工作。

sockets network-programming ttl setsockopt
1个回答
0
投票

您需要坚持延迟或关闭并重新打开套接字,因为 ttl 值由

sendto()
异步设置

© www.soinside.com 2019 - 2024. All rights reserved.