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