2012-08-04 4 views
0

목표 -c에서 토런트 스크래퍼를 만들려고하고 있는데 UDP를 통해 데이터 패킷을 보내려면 CocoaAsyncSocket을 사용하고 있습니다. BitTorrent UDP Tracker Protocol 다음. Wireshark를 사용하여 패킷이 전송되었지만 추적기가 아무것도 보내지 않는다는 것을 확인했습니다. 필자는 데이터 조작에 대한 경험이 거의 없기 때문에 보낸 데이터를 정리하는 데 잘못된 것을하고 있다고 가정합니다. 지금 막 protocol의 연결 요청을 성공적으로 완료하려고합니다.CocoaAsyncSocket을 사용하여 Objective-C의 토런트 추적기에 UDP를 통해 패킷 보내기

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

이 보장됩니다 대리자 방법은 패킷이 들어올 때마다 호출된다 : 여기에 코드

-(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를 반환한다는 점에서 실수를하고 있습니다. 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)]; 

이렇게해도 문제가 해결되지 않으면 적어도 어쨌든 그 지점에 도달하는 데 필요한 단계입니다.

+0

트릭을했는데 도움을 주셔서 감사합니다. :) – Otium

1

나는 당신이 실제로 수신을 시작하기 위해 소켓을 얻을 수있는 방법을 호출 할 필요가 있다고 생각입니다

+0

아직 어떤 데이터도 수신하지 못했습니다. – Otium

관련 문제