Cocoa를 사용하여 소켓 연결에 대한 TTL 값을 명시 적으로 설정할 수 있기를 원합니다. CoreFoundation 문서에서 유용한 것을 볼 수 없었습니다. TTL 값을 설정하려면 BSD 소켓보다 더 낮게 조정해야합니까?코코아에서는 패킷에 TTL을 어떻게 설정합니까?
2
A
답변
3
두 가지 가능성이 있습니다.
1) 일반 C/Unix 스타일 소켓을 사용할 수 있으므로 처음에는 소켓을 만든 다음 추가 할 소켓을 포함하여 setsockopt()를 사용하여 옵션을 설정합니다 (지원되는 경우 먼저 확인할 수 있음).), 마지막으로 CFSocketCreateWithNative()를 사용하여 CFSocket을 만듭니다.
2) 당신은 CF API는,
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 라이브러리를 사용했습니다. 여기에는 하위 소켓 API에 대한 Obj-C 래퍼 인 AsyncUdpSocket이라는 클래스가 포함되어 있습니다. 나는 소켓의 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