在Cocoa中,如何在数据包上设置TTL?

时间:2009-07-02 14:04:38

标签: cocoa sockets core-foundation

我希望能够使用Cocoa显式设置套接字连接的TTL值。我一直无法在CoreFoundation文档中看到任何有用的内容。我是否需要更低的BSD套接字来设置TTL值?

3 个答案:

答案 0 :(得分:4)

您是否正在编写traceroute的YA变体? ;)

是的,普通的C套接字API是你的朋友:像往常一样调用setsockopt(),其中IPv4为IP_TTL套接字选项,IPv6为IPV6_UNICAST_HOPS

答案 1 :(得分:3)

有两种可能性。

1)您可以使用普通的C / Unix样式套接字,以便首先创建套接字,然后使用setsockopt()设置其选项,包括您要添加的套接字(如果支持,您可能需要首先检查) ,最后使用CFSocketCreateWithNative()创建一个CFSocket。

2)你直接使用CF Apis,例如

 CFSocketSendData
Sends data over a CFSocket object.

CFSocketError CFSocketSendData (
   CFSocketRef s,
   CFDataRef address,
   CFDataRef data,
   CFTimeInterval timeout
);

允许您设置超时,这相当于设置套接字选项SO_SNDTIMEO。

    CFSocketCreateConnectedToSocketSignature
Creates a CFSocket object and opens a connection to a remote socket.

CFSocketRef CFSocketCreateConnectedToSocketSignature (
   CFAllocatorRef allocator,
   const CFSocketSignature *signature,
   CFOptionFlags callBackTypes,
   CFSocketCallBack callout,
   const CFSocketContext *context,
   CFTimeInterval timeout
);

亲切的问候。

答案 2 :(得分:1)

我使用了 CocoaAsyncSocket 库。它包含一个名为 AsyncUdpSocket 的类,它是围绕低级套接字API的Obj-C包装器。我添加了一个方法来设置套接字的TTL。

    -(BOOL)setTTL:(int) ttlValue {

    int socketFD = SOCKET_NULL;

    if ( socket4FD != SOCKET_NULL) {
        socketFD = socket4FD;
    }
    else{
        if ( socket6FD != SOCKET_NULL) {
            socketFD = socket6FD;
        }
        else{
            NSLog(@"ERROR: TTL - No Socket Found!");
            return NO;
        }
    }

    int status = setsockopt(socketFD, IPPROTO_IP, IP_TTL, &ttlValue, sizeof(ttlValue));

    if (status == -1){
        NSLog(@"Error: TTL not set!");
        return NO;
    }

    NSLog(@"TTL: %d", ttlValue);
    return YES;
    }
  

我只测试了它的IPv4。对于IPv6,请尝试使用 IPv6_UNICAST_HOPS

相关问题