0

I am working on a little project of mine and have built a UDP scraper that uses sockets to return data about a specific sha1 hash.

It works but is incredibly slow and wondered if any one knows how I could speed it up or improve the existing code.

The code is below;

// SCRAPE UDP
private function scrapeUDP($tracker, $hash) {
    // GET TRACKER DETAILS
    preg_match('%udp://([^:/]*)(?::([0-9]*))?(?:/)?%i', $tracker, $info);
    // GENERATE TRANSACTION ID
    $transID = mt_rand(0, 65535);
    // PACKED TRANSACTION ID
    $packedTransID = pack('N', $transID);
    // ATTEMPT TO CREATE A SOCKET
    if(!$socket = @fsockopen('udp://' . $info[1], $info[2], $errno, $errstr, 2)) {
        return;
    }
    // SET STREAM TIMEOUT
    stream_set_timeout($socket, 2);
    // CONNECTION ID
    $connID = "\x00\x00\x04\x17\x27\x10\x19\x80";
    // BUILD CONNECTION REQUEST PACKET
    $packet = $connID . pack('N', 0) . $packedTransID;
    // SEND PACKET
    fwrite($socket, $packet);
    // CONNECTION RESPONSE
    $response = fread($socket, 16);
    // CHECK CONNECTION RESPONSE LENGTH
    if(strlen($response) < 16) {
        return;
    }
    // UNPACK CONNECTION RESPONSE
    $returnData = unpack('Naction/NtransID', $response);
    // CHECK CONNECTION RESPONSE DATA
    if($returnData['action'] != 0 || $returnData['transID'] != $transID) {
        return;
    }
    // GET CONNECTION ID
    $connID = substr($response, 8, 8);
    // BUILD SCRAPE PACKET
    $packet = $connID . pack('N', 2) . $packedTransID . $hash;
    // SEND SCRAPE PACKET
    fwrite($socket, $packet);
    // SCRAPE RESPONSE
    $response = fread($socket, 20);
    // CHECK SCRAPE RESPONSE LENGTH
    if(strlen($response) < 20) {
        return;
    }
    // UNPACK SCRAPE RESPONSE
    $returnData = unpack('Naction/NtransID', $response);
    // CHECK SCRAPE RESPONSE DATA
    if($returnData['action'] != 2 || $returnData['transID'] != $transID) {
        return;
    }
    // UNPACK SCRAPE INFORMATION
    $returnData = unpack('Nseeders/Ncompleted/Nleechers', substr($response, 8, 12));
    // RETURN TRACKER INFORMATION
    return array('seeders' => $returnData['seeders'], 'leechers' => $returnData['leechers'],);
}

It is my first time I have ever created anything to do with sockets or UDP so forgive me if it is a mess!

Thanks...

4

1 に答える 1

2

応答の待機に多くの時間を費やしているため、socket_select()と非ブロッキングソケットまたはフォークを使用して並列要求を行う必要があります。さらに、socket_read()などの低レベルの関数を使用して、接続とデータ送信をより適切に制御することをお勧めします。

于 2012-06-01T11:46:18.463 に答える