分析 aMule / eMule 的 server.met 文件

原创 2007年09月19日 21:01:00

前几天 DonkeyServer 被迫关闭了,原来的服务器列表里却不剩几个可用的服务器。连忙找人家 eMule 的服务器列表──server.met,打开一看,二进制的,晕!还好有 spec

#!/usr/bin/perl -w

# server.met ref:
# http://www.amule.org/wiki/index.php/Server.met_file
#

use strict;

my ( $buf, $verify, $servers, $ip, $port, $tags, $tag_type, $tag_name_length,
    
$tag_name, $tag_value_length, $tag_value );
my @ip;
my %tagid = ( 0x01 => "Server name", 0x0b => "Description", 0x0c => "Ping",
    
0x0d => "Fail", 0x0e => "Preference", 0x85 => "DNS", 0x87 => "Max users",
    
0x88 => "Soft files", 0x89 => "Hard files", 0x90 => "Last ping",
    
0x91 => "Version", 0x92 => "UDP flags", 0x93 => "Auxiliary ports list",
    
0x94 => "LowID clients" );
my $output = '';

while ( my $file = shift @ARGV ) {

open FH, "$file" or die "Can't open file: $file ";
binmode FH;

sysread ( FH, $buf, 5 );
$verify, $servers ) = unpack ( "CV", $buf );

# Verify the file
unless ( $verify == 0x0e || $verify == 0xe0 ) {
    
close FH;
    
printf "%02x ", $verify;
    
die "The file: $file is NOT a verified server.met file";
}
else {
    
#print "" . ( "=" x 78 ) . " File: $file ";
    $output .= ( "=" x 78 ) . " File: $file ";
}

# How many servers
#printf "Servers: %d ", $servers;

$output .= sprintf "Servers: %d ", $servers;

for ( my $i = 0$i != $servers$i++ ) {
    
#print '-' x 78, " ";
    $output .= ( '-' x 78 ) . " ";

    
sysread ( FH, $buf, 10);
    ( 
$ip[0], $ip[1], $ip[2], $ip[3], $port, $tags ) = unpack ( "C4vV", $buf );
    
#print "ip: ", join ( ".", @ip ), " ";
    #print "port: $port tags: $tags ";

    $output .= "ip: " . join ( ".", @ip ) . " port: $port tags: $tags ";

    
for ( my $j = 0$j != $tags$j++ ) {
        
sysread ( FH, $buf, 3 );
        ( 
$tag_type, $tag_name_length ) = unpack ( "Cv", $buf );

        
sysread ( FH, $tag_name, $tag_name_length );
        
if ( $tag_name_length == 1 ) {
            
$tag_name = unpack ( "C", $tag_name );
            
$tag_name = $tagid{$tag_name|| sprintf ( "0x%02x", $tag_name );
        }

        
if ( $tag_type == 0x02 ) {      # Is String
            #printf "S[0x%08X] %s: ", sysseek ( FH, 0, 1 ) + 2, $tag_name;

            $output .= sprintf "S[0x%08X] %s: ", sysseek ( FH, 0, 1 ) + 2, $tag_name;

            
sysread ( FH, $buf, 2 );
            
$tag_value_length = unpack ( "v", $buf );
            
sysread ( FH, $tag_value, $tag_value_length );

            
# strip the BOM off
            $tag_value = substr ( $tag_value, 3 ) if ( substr ( $tag_value, 0, 3 ) eq "" );
        }
        
elsif ( $tag_type == 0x03 ) {   # Is Numeric
            #printf "N[0x%08X] %s: ", sysseek ( FH, 0, 1 ), $tag_name;

            $output .= sprintf "N[0x%08X] %s: ", sysseek ( FH, 0, 1 ), $tag_name;

            
sysread ( FH, $buf, 4 );
            
$tag_value = unpack ( "V", $buf );
        }
        
else {                          # Invalid
            printf "Wrong tag type at %08x: %02x ",
                
sysseek ( FH, 0, 1 ) - $tag_name_length,
                
$tag_type;
            
close FH;
            
die;
        }

        
#print "$tag_value ";
        $output .= "$tag_value ";
    }
}

close FH;

}
print $output;

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

mldonkey用的Server.met文件

server.met

Emule-文件分块-损坏的处理

原文:http://www.emule.org.cn/faq/doc/corruption_handling.htm损坏的处理eMule 使用各种的方式来确保文件在网络共享及下载没有错误. 万一错误发...

aMule代码分析(1)——用doxyfile生成文档

前几天都是用Vim在看代码,可是对于wxWidget的机制不太熟,抓不住程序的运行轨迹,后来学习了GDB,自己猜着设断点,就知道有些类的运行过程了。但是aMule里面类太多,太庞大,Maxiee感觉自...

aMule代码分析(2)——CFileDataIO类和CFile类

aMule中的类很多,Maixee今天选择了两个比较基础的类,均是跟文件操作有关的,分别是CFileDataIO类和CFile类。其中,前者是基类,后者由它派生而出的。具体的继承关系,可以参考这张图:

emule server

  • 2011-06-07 16:38
  • 9.02MB
  • 下载

eMule代码分析(1)----错误机制

最近在研究eMule代码,eMule是一款开源的软件,采用VS2003,MFC开发,微软的各个东西,都用到极致了。 本节主要是节选一个小功能,Crash机制。 首先我先复习一下Windows异常机...

ed2k 网络中搜索资源并选择资源下载的分析及eMule源码梳理

上一篇博客中,客户端已连接到ed2k网络及客户端与服务器交互的eMule源码梳理,这里将开始搜索资源并下载及客户端与客户端交互的eMule源码梳理 搜索资源并下载,这是一个即包含和和服务器交互还包含...

eMule代码分析(2)------内存管理

由于网上一哥们恰好跟我的想法一致,那我这边就借花献佛,直接献上eMule的内存管理分析:(此文属于转载) 1、内存管理器类CMemPoolMgr有一个成员m_MemoryUnitList,我们称作内...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)