0

我正在尝试在objective-c中创建一个torrent scraper,我正在使用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

我认为您需要调用一个方法才能真正让套接字开始接收:

- (BOOL)beginReceiving:(NSError **)errPtr;

这将确保每次数据包进来时都会调用委托方法。

于 2012-08-04T21:36:46.967 回答
1

现在我想我知道问题所在了。

由于必须将连接 ID 初始化为该确切值,因此您需要确保它是完整的。你犯了一个错误,因为 htonl() 返回一个 uint32_t,这不是你想要的。您需要将连接 ID 分成两部分,并独立地将它们转换为网络字节顺序。

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 回答