我正在尝试在objective-c中创建一个torrent刮刀,我正在使用CocoaAsyncSocket通过UDP发送数据包。在BitTorrent UDP Tracker Protocol之后。我已经使用Wireshark验证了数据包是否已发送,但是跟踪器不会发回任何内容。我假设我在汇总发送的数据时做错了,因为我对数据操作的经验很少。现在我只是想成功完成protocol的连接请求。这是代码
-(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];
}
答案 0 :(得分:1)
我认为你需要调用一个方法来实际让套接字开始接收:
- (BOOL)beginReceiving:(NSError **)errPtr;
这将确保每次数据包进入时都会调用委托方法。
答案 1 :(得分: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)];
如果这不能解决您的问题,那么无论如何都至少是达到这一点的必要步骤。