2012-08-04 48 views
0

我正在尝试在objective-c中创建一个torrent scraper,我使用CocoaAsyncSocket通过UDP发送数据包。在BitTorrent UDP Tracker Protocol之后。我已经使用Wireshark验证数据包已发送,但跟踪器不会发回任何内容。我假设我将所发送的数据放在一起做错了,因为我对数据操作的经验很少。现在我只是试图成功完成protocol的连接请求。下面是代码通过UDP发送数据包到Objective-C的洪流跟踪器与CocoaAsyncSocket

-(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]; 

} 

回答

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)]; 

如果这不能解决您的问题,那至少是到达该点所需的步骤。

+0

这样做的窍门,感谢您的帮助:) – Otium 2012-08-04 23:33:24

1

我认为你需要调用一个方法来实际获得插座开始接收:

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

这将确保委托方法被调用每一个数据包到来时

+0

仍然没有收到任何数据 – Otium 2012-08-04 21:49:31