2009-07-02 5 views

答えて

3

2つの可能性があります。

1)単純なC/Unixスタイルのソケットを使用することができます。最初にソケットを作成し、追加するものを含むsetsockopt()を使用してオプションを設定します。 )、最後にCFSocketCreateWithNative()を使ってCFSocketを作成します。あなたはCFアピス直接使用

2)は、例えば

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 
); 

大切にしています。

4

あなたはtracerouteのYAバリアントを書いていますか? ;)

はい、普通のCソケットAPIはあなたの友人です:setsockopt()IP_TTLソケットオプション(IPv4用)またはIPV6_UNICAST_HOPS(IPv6用)と呼んでください。

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

関連する問題