使用CocoaAsyncSocket通过UDP将数据包发送到Objective-C中的torrent跟踪器

时间:2012-08-04 18:13:12

标签: objective-c sockets udp bittorrent

我正在尝试在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];

}

2 个答案:

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

如果这不能解决您的问题,那么无论如何都至少是达到这一点的必要步骤。