众所周知QQ是主要采用UDP通信协议来通信的,在QQ登陆时,服务器会返回在线好友列表 和离线消息,譬如要服务器用UDP返回好友列表时(包括好友的QQ号码、IP还有其他信息),是不是先把好友的信息读入一个内存流然后再用winsock发回给客户端呢?如果客户端要接受的话,应该怎样实现分段接受然后把个个信息分别拆开来?(因为返回的是一个好友列表,一个好友信息有:好友的QQ号码、IP还有其他信息等。又或者不是用这种方式来实现呢?请高手指点迷津!小弟愿意听教!
(在线等待)

解决方案 »

  1.   

    也给我一份
    [email protected]
    谢谢
      

  2.   

    [email protected] a lot!!!
      

  3.   

    好东西大家分享[email protected]谢了
      

  4.   

    我也要[email protected]
    thanks!!
      

  5.   

    thank u very much~
    [email protected]
      

  6.   

    [email protected] 谢谢!
      

  7.   

    [email protected]强烈要求!!!!!!!!
    多谢!多谢!希望是真的!
      

  8.   

    我也要一份,[email protected]强烈感谢
    另外,我认为你首先应该用帧听工具将qq的封包格式分析一下,有了一个大致的了解以后再分析
      

  9.   

    [email protected]
    万分感谢!
      

  10.   

    我也要,[email protected],谢谢!
      

  11.   

    我也要一份,谢谢![email protected]
      

  12.   

    [email protected],我也要,谢谢!我的QQ是3112546,交个朋友!
      

  13.   

    我也想要,能不能来一份,万分感谢
    [email protected]
      

  14.   

    我自己的AneQQ是这样实现的:
    下面的只是一部分.
    // data.h: interface for the CData class.
    //
    //////////////////////////////////////////////////////////////////////#if !defined(AFX_DATA_H__F849DA10_B160_11CF_BC5B_5254AB4B2098__INCLUDED_)
    #define AFX_DATA_H__F849DA10_B160_11CF_BC5B_5254AB4B2098__INCLUDED_#if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000#define Max_Data_Length 1024class CData  
    {
    public:
    CData();
    virtual ~CData();
    //methods and operations
    public:
    virtual void Build();             //将数据缓冲区中的数据解码到成员中
    virtual BOOL Load();              //填充数据缓冲区
    //data members
    public:
    BYTE    type ;                    //消息类型
    BYTE    WndIndex;                 //处理该消息的窗口句柄索引
    DWORD   flag    ;                 //消息标记 UINT    dstPort ;                 //目的IP地址
    UINT    dstIP ;                   //目的端口号
    char    buffer[Max_Data_Length] ; //数据缓冲区
    WORD    buf_len ;                 //数据缓冲区中数据长度
    WORD    buf_offset;               //数据缓冲区中特殊数据的偏移
    private:protected:

    };inline void CopyData(CData *dst,CData *src)
    {
    for ( int i = 0 ;i < src->buf_len ; i ++ )
    dst->buffer[i] = src->buffer[i] ;
    dst->type       = src->type       ;
    dst->dstIP      = src->dstIP      ;
    dst->dstPort    = src->dstPort    ;
    dst->WndIndex   = src->WndIndex   ;
    dst->buf_len    = src->buf_len    ;
    dst->buf_offset = src->buf_offset ;
    }#endif // !defined(AFX_DATA_H__F849DA10_B160_11CF_BC5B_5254AB4B2098__INCLUDED_)
    ///
    // data.cpp: implementation of the CData class.
    //
    //////////////////////////////////////////////////////////////////////
    #include "data.h"#ifdef _DEBUG
    #undef THIS_FILE
    static char THIS_FILE[]=__FILE__;
    #define new DEBUG_NEW
    #endif//////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////CData::CData()
    {
    type       = 0;
    WndIndex   = 0 ;
    dstPort    = 0;
    dstIP      = 0
    buf_len    = 0 ;
    buf_offset = 0 ;
    flag       = 0 ;
    memset(buffer,0,Max_Data_Length);
    }CData::~CData()
    {}void CData::Build()
    {
    char *cp = buffer ; //开头是固定数据
    *(BYTE *)cp = type ;      //消息类型
    cp += sizeof(BYTE) ; *(BYTE *)cp = WndIndex ;  //窗口句柄索引
    cp += sizeof(BYTE); *(DWORD *)cp = flag ;     //消息标记
    cp += sizeof(DWORD) ;    //以下是附加数据的开始地址
    buf_len    = cp - buffer ;
    buf_offset = cp - buffer ;//用户数据的偏移量
    }BOOL CData::Load()
    {
    char *cp  = buffer ; type = *(BYTE *)cp ;      // 消息类型
    cp += sizeof(BYTE) ; WndIndex = *cp ;          //窗口句柄索引
    if( WndIndex < 0 && WndIndex >= MaxRecvWndCount )
    return FALSE ;
    cp += sizeof(WndIndex); flag = *(DWORD *)cp;
    cp += sizeof(DWORD); buf_offset = cp - buffer ;//用户数据的偏移量 return (buf_offset <= buf_len );
    }
    ////////////////////////////////////////////////////////////Talker的基本信息
    #define Max_String_len 32 class CTalkerBaseInfo  
    {
    public:
    CTalkerBaseInfo();
    virtual ~CTalkerBaseInfo();
    public:
    char    pet_name[ Max_String_len ]  ;
    char    real_name[ Max_String_len ] ;
    char    pass_word[ Max_String_len ] ;
    char    dept[ Max_String_len ]      ;
    char    occupation[ Max_String_len ];
    char    email[ Max_String_len*2 ]   ;
    char    homepage[ Max_String_len*2 ];
    char    desc[ Max_String_len*2 ]    ;
    BYTE    sex    ;
    BYTE    age    ;
    WORD    ID     ;  //唯一标识符
    BYTE    character;//1=可以被加为好友,2=需要身份验证,4=拒绝被加为好友;
    BYTE    pic_idx;  //头像编号
    };
    class CTalker  : public CTalkerBaseInfo
    {
    public:
    CTalker();
    virtual ~CTalker();
    public:
    BYTE    status ;  //状态
    UINT    ip     ;  //当前的IP地址
    UINT    port   ;  //当前的PORT号
    DWORD   dwTickCount ;
    };
    //
    class CTalker  : public CTalkerBaseInfo
    {
    public:
    CTalker();
    virtual ~CTalker();
    public:
    BYTE    status ;  //状态
    UINT    ip     ;  //当前的IP地址
    UINT    port   ;  //当前的PORT号
    DWORD   dwTickCount ;
    };
      

  15.   

    // Talker.cpp: implementation of the CTalker class.
    //
    //////////////////////////////////////////////////////////////////////
    #include "Talker.h"#ifdef _DEBUG
    #undef THIS_FILE
    static char THIS_FILE[]=__FILE__;
    #define new DEBUG_NEW
    #endif//////////////////////////////////////////////////////////////////////
    // CTalkerBaseInfo Class
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////CTalkerBaseInfo::CTalkerBaseInfo()
    {
    memset(this, 0, sizeof( *this ) );
    }CTalkerBaseInfo::~CTalkerBaseInfo()
    {}//////////////////////////////////////////////////////////////////////
    // CTalker Class
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////CTalker::CTalker()
    {
    status      = 0 ;  //状态
    ip          = 0 ;  //当前的IP地址
    port        = 0 ;  //当前的PORT号
    dwTickCount = 0 ;
    }CTalker::~CTalker()
    {}
    //////////////////////////////////////////////
    class CMsgTalkerDetail : public CData
    {
    public:
    virtual void Build();
    virtual BOOL Load();
    public:
    CMsgTalkerDetail();
    virtual ~CMsgTalkerDetail();
    public:
    DWORD   options;
    CTalker talker ;
    };//////////////////////////////////////////////////////////////////////
    // CMsgTalkerDetail Class
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////CMsgTalkerDetail::CMsgTalkerDetail()
    {
    options    = 0 ;
    memset(&talker, 0, sizeof(CTalker));
    }CMsgTalkerDetail::~CMsgTalkerDetail()
    {}
      

  16.   

    void CMsgTalkerDetail::Build()
    {
    CData::Build() ;
    char *cp = (char *)(buffer + buf_offset ); BYTE iLen = 0 ; *(DWORD *)cp = options  ;
    cp += sizeof( DWORD ); //用户信息用TLV编码格式发送
    if ( ( iLen = strlen(talker.pet_name) ) > 0 )
    {
    *(BYTE *)cp = PETNAME ;        //type
    cp += sizeof( BYTE );
    *(BYTE *)cp = iLen ;           //length
    cp += sizeof( BYTE );
    memcpy(cp,talker.pet_name,iLen); //value
    cp += iLen ;
    }
    if ( ( iLen = strlen(talker.real_name ) ) > 0 )
    {
    *(BYTE *)cp = REALNAME ;       //type
    cp += sizeof( BYTE );
    *(BYTE *)cp = iLen ;           //length
    cp += sizeof( BYTE );
    memcpy(cp,talker.real_name,iLen); //value
    cp += iLen ;
    }
    if ( ( iLen = strlen(talker.pass_word ) ) > 0 )
    {
    *(BYTE *)cp = PASSWORD ;        //type
    cp += sizeof( BYTE );
    *(BYTE *)cp = iLen ;            //length
    cp += sizeof( BYTE );
    memcpy(cp,talker.pass_word,iLen); //value
    cp += iLen ;
    }
    if ( ( iLen = strlen(talker.dept ) ) > 0 )
    {
    *(BYTE *)cp = DEPT ;            //type
    cp += sizeof( BYTE );
    *(BYTE *)cp = iLen ;            //length
    cp += sizeof( BYTE );
    memcpy(cp,talker.dept,iLen);      //value
    cp += iLen ;
    }
    if ( ( iLen = strlen(talker.occupation ) ) > 0 )
    {
    *(BYTE *)cp = OCCUPATION ;       //type
    cp += sizeof( BYTE );
    *(BYTE *)cp = iLen ;             //length
    cp += sizeof( BYTE );
    memcpy(cp,talker.occupation,iLen); //value
    cp += iLen ;
    }
    if ( ( iLen = strlen(talker.email ) ) > 0 )
    {
    *(BYTE *)cp = EMAIL ;        //type
    cp += sizeof( BYTE );
    *(BYTE *)cp = iLen ;         //length
    cp += sizeof( BYTE );
    memcpy(cp,talker.email,iLen);  //value
    cp += iLen ;
    }
    if ( ( iLen = strlen(talker.homepage ) ) > 0 )
    {
    *(BYTE *)cp = HOMEPAGE ;       //type
    cp += sizeof( BYTE );
    *(BYTE *)cp = iLen ;           //length
    cp += sizeof( BYTE );
    memcpy(cp,talker.homepage,iLen);    //value
    cp += iLen ;
    }
    if ( ( iLen = strlen(talker.desc ) ) > 0 )
    {
    *(BYTE *)cp = DESCRIPT ;        //type
    cp += sizeof( BYTE );
    *(BYTE *)cp = iLen ;            //length
    cp += sizeof( BYTE );
    memcpy(cp,talker.desc,iLen);     //value
    cp += iLen ;
    } *(BYTE *)cp = SEX ;           //type = SEX
    cp += sizeof(BYTE);           //没有长度,只有值
    *(BYTE *)cp = talker.sex ;      //value = talker.sex
    cp += sizeof(BYTE);           //2字节 *(BYTE *)cp = AGE ;           //type = AGE
    cp += sizeof(BYTE);           //没有长度,只有值
    *(BYTE *)cp = talker.age ;      //value = talker.sex
    cp += sizeof(BYTE);           //2字节 *(BYTE *)cp = USERID ;        //type = USERID
    cp += sizeof(BYTE);           //没有长度,只有值
    *(WORD *)cp = talker.ID ;       //value = talker.ID
    cp += sizeof(WORD);           //3字节 *(BYTE *)cp = STATUS ;        //type = STATUS
    cp += sizeof(BYTE);           //没有长度,只有值
    *(BYTE *)cp = talker.status;    //value = talker.status
    cp += sizeof(BYTE);           //2字节 *(BYTE *)cp = PIC_IDX ;       //type = PIC_IDX
    cp += sizeof(BYTE);           //没有长度,只有值
    *(BYTE *)cp = talker.pic_idx;   //value = talker.status
    cp += sizeof(BYTE);           //2字节 *(BYTE *)cp = CHARACTER ;     //type = CHARACTER
    cp += sizeof(BYTE);           //没有长度,只有值
    *(BYTE *)cp = talker.character; //value = talker.character
    cp += sizeof(BYTE);           //2字节 *(BYTE *)cp = IPADDR ;        //type = IPADDR
    cp += sizeof(BYTE);           //没有长度,只有值
    *(UINT *)cp = talker.ip;        //value = talker.ip
    cp += sizeof(UINT);           //5字节 *(BYTE *)cp = PORT ;          //type = PORT
    cp += sizeof(BYTE);           //没有长度,只有值
    *(UINT *)cp = talker.port;      //value = talker.port
    cp += sizeof(UINT);           //5字节 *(BYTE *)cp = TYPE_END ;
    cp += sizeof(BYTE);           //1字节 buf_len    = ( cp - buffer );
    buf_offset = ( cp - buffer );
    }
      

  17.   

    [email protected]
    多谢!!!
      

  18.   

    我也来一份?
    [email protected]
      

  19.   

    我也来一份
    [email protected]谢谢!
      

  20.   

    我也来一份
    [email protected]
    呵呵,这么多份,你给得过来吗???:)
      

  21.   

    楼上的大哥,你辛苦了给我一份也,谢谢:))[email protected]要不把它贴出来吧
      

  22.   

    anyiflyer(西门吹雪) :
      可以将你的那个用VC写成的代码给我吗?我不想再整理你的代码!
      [email protected]
      thank you!
      

  23.   

    我也要!
    [email protected]
    谢谢!
      

  24.   

    给我一份
    [email protected]
    Thank you
      

  25.   

    我也想要一份,
    [email protected]
      

  26.   

    不错,
    [email protected]
    谢谢。
      

  27.   

    兄弟,也给我一份
    [email protected]
      

  28.   

    是腾训的吗?包括服务器和客户端吗?有文档吗?那个版本的?我也要;    [email protected]
      

  29.   

    也给我一分[email protected]  
    谢谢!
      

  30.   

    Me too !!!
    [email protected]
      

  31.   

    好東西,給一份看看,謝謝了!
    [email protected]
      

  32.   

    我也要,谢谢了
    [email protected]
      

  33.   

    还有我的,谢谢
    [email protected]
      

  34.   

    我也要谢谢
    [email protected]
      

  35.   

    [email protected]  Thanks!
      

  36.   

    能给我一份吗?我也想要[email protected] 
    谢谢
      

  37.   

    我也想要一份:[email protected]
      

  38.   

    先谢
    我也想要一份:[email protected]
      

  39.   

    好东西我也想要一份.
    [email protected]
      

  40.   

    [email protected]
    thank you very much.
      

  41.   

    强烈要求!!!!!!!!
    多谢!多谢!希望是真的!
    [email protected]
      

  42.   

    我也要一份
    [email protected]
      

  43.   

    我好想要,谢谢!
    [email protected]
      

  44.   

    我也要个谢了!:)
    [email protected]
      

  45.   

    给我一份,[email protected]
    谢谢
      

  46.   

    给我一份,[email protected]
    谢谢
      

  47.   

    给我一份[email protected]
    thank u.
      

  48.   

    给我一份。[email protected]
    谢谢
      

  49.   

    我也要一份,嘿嘿:[email protected]!
      

  50.   

    [email protected]
    多谢了!
      

  51.   

    我是不是来晚了,我也要一份,谢谢。
    [email protected]
      

  52.   


    好东西大家分享[email protected]谢了
      

  53.   

    我也要!!谢谢
    [email protected]
      

  54.   

    [email protected]
    非常感谢!!
      

  55.   

    不知道我来晚了没有
    我也要
    3X
    [email protected]