是包的内容加密了,还是获得的字节流不是host的顺序。
需要network to host 吗
多少给点想法。

解决方案 »

  1.   

    45-00-00-3C-00-00-40-00-31-11-15-C9-3D-8D-C2-CB-DA-3F-59-50-1F-40-0F-A0-00-28-3B-45-02-01-00-00-02-68-60-73-EF-5E-D8-BD-95-D2-AD-A5-93-CB-14-FA-14-97-E4-74-53-DE-90-01-FD-69-6E-03这是QQ接收到的UDP包中的内容呀!你要经过相应的变换才能得到IP地址一类的。
    比如这样:public Packet(byte[] raw, DateTime time) 
    {
    if (raw == null)
    throw new ArgumentNullException();
    if (raw.Length < 20)
    throw new ArgumentException(); // invalid IP packet
    m_Raw = raw;
    m_Time = time;
    m_Version = (raw[0] & 0xF0) >> 4;
    m_HeaderLength = (raw[0] & 0x0F) * 4 /* sizeof(int) */;
    if ((raw[0] & 0x0F) < 5)
    throw new ArgumentException(); // invalid header of packet
    m_Precedence = (Precedence)((raw[1] & 0xE0) >> 5);
    m_Delay = (Delay)((raw[1] & 0x10) >> 4);
    m_Throughput = (Throughput)((raw[1] & 0x8) >> 3);
    m_Reliability = (Reliability)((raw[1] & 0x4) >> 2);
    m_TotalLength = raw[2] * 256 + raw[3];
    if (m_TotalLength != raw.Length)
    throw new ArgumentException(); // invalid size of packet
    m_Identification = raw[4] * 256 + raw[5];
    m_TimeToLive = raw[8];
    if (Enum.IsDefined(typeof(Protocol), (int)raw[9]))
    m_Protocol = (Protocol)raw[9];
    else
    m_Protocol = Protocol.Other;
    m_Checksum = new byte[2];
    m_Checksum[0] = raw[11];
    m_Checksum[1] = raw[10];
    m_SourceAddress = new IPAddress(BitConverter.ToUInt32(raw, 12));
    m_DestinationAddress = new IPAddress(BitConverter.ToUInt32(raw, 16));
    if (m_Protocol == Protocol.Tcp || m_Protocol == Protocol.Udp) 
    {
    m_SourcePort = raw[m_HeaderLength] * 256 + raw[m_HeaderLength + 1];
    m_DestinationPort = raw[m_HeaderLength + 2] * 256 + raw[m_HeaderLength + 3];

    else 
    {
    m_SourcePort = -1;
    m_DestinationPort = -1;
    }
    QQName =BitConverter.ToString(m_Raw);
    qqName1 = BitConverter.ToString(m_Raw,36,4);
    }
      

  2.   

    晕!说错了。
    你得到包内容不是16进制的。是字节。
    QQName =BitConverter.ToString(m_Raw);
    但你经过转换后得到的是16进制的内容所以就出现了单个字母一类的问题。
    你参考一下关于QQ的UDP包的包内容你就知道了!
    1、网卡地址段
    00000000 00 80 C8 EB 06 3B 00 80 C8 EB 25 18 08 00
    如上可所视00 80 到第一行的确良08 00为网卡地址段。开始的六个字节00 80 C8 EB 06 3B为对方服务器网 络适配器在内存中的地址,00 80 C8 EB 25 18 ,这六个节嘛就代表我这台机子上的调解在内存中的地址。然后的08表示该数据传输协议将用TCP/IP协议传输。00表示下面将用TCP/IP协议中的IP协议传输。2、IP协议段
    00000000 45 00 .....;....%...E.
    00000010 00 78 48 8A 00 00 80 11 BC 3A C0 A8 00 02 CA 60 .xH......:.....`
    00000020 AA A5
    如上所示45 00 到AA A5之前的代码都代表了IP段的内容。45代表此IP协议版本是4.0版本,IP关长度是20字节。即从45到AA A5的20个字节。00 是代表IP包的优先级。这里是平常的没有设等级。00 78转换成十进制是120。(倒过来算,0078=120(十进制))表示此数据包的所有数据有120个字节。48 8A 代表IP协议的身份验证, 00 00是IP协议的摘要,80传表IP数据包的生存时间。11这里很重要,表示此IP数据段完成以后将由UPD协议来 代替,由此我们可以得知OICQ消息传播是通过UDP协议来实现的。BC 3A是用来校检数据包的正确性的。C0 A8 00 02代表我的IP地址。用计算器可以转化成192.168.0.2。CA 60 AA A5代表目的IP,即202.96.170.165。此IP 数据段就完成了。余下的就是UDP数据段了。3、UDP数据段
    00000020 0F A0 1F 40 00 64 AA 4E 02 04 05 00 15 F7 [email protected]......
    00000030 2F 00 BD 77 9D F3 BE 2E 18 9A 86 DA 47 B4 83 41 /..w........G..A
    00000040 3A A1 A5 60 89 AD 78 61 D7 EE 6A ED 5C 05 25 EA :..`..xa..j.\.%.
    00000050 17 95 B0 5C 3B 69 F1 1C 0F 5D C1 4C 91 FD C3 A8 ...\;i...].L....
    00000060 1D 33 9C 86 2A 0F 12 11 EA A8 29 E4 AC 64 D4 D6 .3..*.....)..d..
    00000070 A4 96 4D 86 AD C2 19 F1 ED E9 FB 7B 74 99 B7 7A ..M........{t..z
    00000080 C3 FB C2 B5 7D 03
      如上可看到此段即为激动人心的UDP数据段了。我们开始分析。0F A0代表我是通过哪个端口进行发送消息的 ,这里可以换算成4000,即我用4000的端口进行消息发送。1F 40代表腾讯的OICQ主机是通过哪个端口接收消息 ,这里可以换算成十进制的8000。即腾讯的OICQ服务器是通过8000端口接收消息的。00 64代表此UDP数据段的 总的字节是100。AA 4E是拿来校检UDP数据段的数据的。余下的数据就是此UDP数据包传送的数据。而前面都是 一些控制协议。下面我们将解析这些数据。02 04 05 00似乎是一些和版本有关的数。相同版本的数据相同的。 15代表登录服务器,F7 2F 00可能是和一些顺序号有关。接下来的三个字节是从高到低放着你的OICQ号。后面的16位字节是随机产生的16个字节的密钥,64字节口令加密内容。 最后03表示UDP数据结束。一般是固定的值。
    当OICQ的服务器收到此登录数据包以后通过验证,服务器将反馈给你一个数据包,这里你的OICQ就上线了。
    OICQ上线以后,每隔一段时间服务器向你发送一个数据包,上面有你好友的IP和号码,用此来表示你好友在线的情。你同时也反回一个数据包给服务器。里面当然也包括你的IP了。表示你在线。如果你没有反回一个数据包给服务器,那么就表示你不在线了,这时你在你的朋友的OICQ上就不在线了。