5

タイムアウトとTTLでpingを実行したい。Apple のコード ( "Simple Ping" ) を使用しています。「iOS ping with timeout」と読みました 。コードを変更します:

CFSocketNativeHandle sock = CFSocketGetNative(self->_socket);
struct timeval tv;
tv.tv_sec  = 0;
tv.tv_usec = 100000; // 0.1 sec
setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (void *)&tv, sizeof(tv));

bytesSent = sendto(
    sock,
    [packet bytes],
    [packet length], 
    0, 
    (struct sockaddr *) [self.hostAddress bytes], 
    (socklen_t) [self.hostAddress length]
);

しかし、パケット受信のタイムアウトを表示するコードをどこに置くべきかわかりません。また、TTL (time-to-live) 情報を使用して ping を実行する必要があります。このパターンに基づいて情報を取得したい:icmp_seq=count from=ip_address ttl=value_of_ttl time=value_of_replytime_ms

4

2 に答える 2

0

IP ヘッダーのデフォルト TTL を変更するには、パラメータとして IP_TTL を指定して setsockopt を呼び出します (IPv4 でテスト済み)。

- (BOOL)setTTL:(int)ttl{
    CFSocketNativeHandle sock = CFSocketGetNative(self->_socket);
    int status  = setsockopt(sock, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl));
    if(status < 0)
    {
        return NO;
    }
    return YES;
}

タイムアウト付きの iOS ping」の例では、出力タイムアウトをソケットに追加します。私が理解していることから、パケットがこの期間内にソケットによって送信されない場合、タイムアウトになります。私は間違っている可能性がありますが、ICMP ヘッダーと IPv4 ヘッダー ( ICMP パケット形式) からこの「タイムアウト」値を見つけることができません。以下は、Apple の単純な ping を使用してキャプチャされたコンソール ログと要求、応答パケットです。

ここに画像の説明を入力

ここに画像の説明を入力

ここに画像の説明を入力

ping の応答時間だけを知りたい場合は、デリゲート メソッドで自分で追跡できると思います。「didSendPacket」関数と「didReceivePingResponsePacket」関数が呼び出されたときのタイムスタンプを取得し、違いを比較します。

于 2015-12-22T03:30:31.450 に答える
-1

receivefrom にはいつでも制限時間を設定できます。

        tv.tv_sec = 0;
        tv.tv_usec = 10000;
        setsockopt(recv_sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv,sizeof(struct   timeval));
于 2013-01-13T14:50:00.147 に答える