0

Objective-C で torrent スクレーパーを作成しようとしています。CocoaAsyncSocketを使用して UDP 経由でデータ パケットを送信しています。BitTorrent UDP トラッカー プロトコルに従います。Wireshark を使用してパケットが送信されたことを確認しましたが、トラッカーは何も返信しません。データ操作の経験がほとんどないため、送信されるデータをまとめる際に何か間違ったことをしていると思います。現在、プロトコルの接続要求を正常に完了しようとしています。ここにコードがあります

-(void)connect {

     NSString *host = @"tracker.publicbt.com";
     GCDAsyncUdpSocket *socket = [[GCDAsyncUdpSocket alloc]initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
     [socket connectToHost:host onPort:80 error:nil];


}

-(void)udpSocket:(GCDAsyncUdpSocket *)sock didConnectToAddress:(NSData *)address {
    uint64_t connection_id = htonl(0x41727101980);
    uint32_t action = htonl(0);
    uint32_t transaction_id = htonl(122);
    NSMutableData *data = [NSMutableData data];
    [data appendBytes:&connection_id length:sizeof(connection_id)];
    [data appendBytes:&action length:sizeof(action)];
    [data appendBytes:&transaction_id length:sizeof(transaction_id)];
    [sock sendData:data toAddress:address withTimeout:-1 tag:1];

}
4

2 に答える 2

1

今、私は問題を知っていると思います。

接続IDはその正確な値に初期化する必要があるため、完全な値であることを確認する必要があります。htonl()がuint32_tを返すという間違いを犯していますが、これはあなたが望むものにはなりません。接続IDを2つの部分に分割し、それらを独立してネットワークバイトオーダーに変換する必要があります。

uint64_t wholeConnectionID = 0x41727101980LLU;

uint32_t connectionID[2];
connectionID[0] = htonl(wholeConnectionID >> 32);
connectionID[1] = htonl(wholeConnectionID & 0xffffffff);

// ...

[data appendBytes:connectionID length:sizeof(connectionID)];

これで問題が解決しない場合は、とにかくそのポイントに到達するために少なくとも必要な手順になります。

于 2012-08-04T22:32:43.787 に答える