Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1152369
  • 博文数量: 222
  • 博客积分: 5262
  • 博客等级: 大校
  • 技术积分: 3028
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-22 19:10
文章分类

全部博文(222)

文章存档

2012年(2)

2011年(192)

2010年(28)

分类: 嵌入式

2011-07-14 20:14:59

接上一篇文章,下面的代码是处理版本信息的。
BOOL
vncClientThread::InitVersion()
{
    rfbProtocolVersionMsg protocol_ver;
    protocol_ver[12] = 0;
    if (strcmp(m_client->ProtocolVersionMsg,"0.0.0.0")==NULL)
    {
        // Generate the server's protocol version
        rfbProtocolVersionMsg protocolMsg;
        if (SPECIAL_SC_PROMPT)
        {
            //This break rfb protocol, SC in ultravnc only  rfb 3.14/16
            sprintf((char *)protocolMsg,
                    rfbProtocolVersionFormat,
                    rfbProtocolMajorVersion,
                    rfbProtocolMinorVersion +10+ (m_server->MSLogonRequired() ? 0 : 2));
        }
        else
        {
            sprintf((char *)protocolMsg,
                    rfbProtocolVersionFormat,
                    rfbProtocolMajorVersion,
                    rfbProtocolMinorVersion + (m_server->MSLogonRequired() ? 0 : 2)); // 4: mslogon+FT,
                                                                                  // 6: VNClogon+FT
        }
        // Send the protocol message
        //m_socket->SetTimeout(0); // sf@2006 - Trying to fix neverending authentication bug - Not sure it's a good idea...
        //adzm 2009-06-20 - if SC, wait for a connection, rather than timeout too quickly.
        if (SPECIAL_SC_PROMPT) {
            //adzm 2009-06-20 - TODO - perhaps this should only occur if we can determine we are using a repeater?
            m_socket->SetTimeout(0);
        }

        if (!m_socket->SendExact((char *)&protocolMsg, sz_rfbProtocolVersionMsg))
            return FALSE;

        // Now, get the client's protocol version
        if (!m_socket->ReadExact((char *)&protocol_ver, sz_rfbProtocolVersionMsg))
            return FALSE;
    }
    else
        memcpy(protocol_ver,m_client->ProtocolVersionMsg, sz_rfbProtocolVersionMsg);

    // sf@2006 - Trying to fix neverending authentication bug - Check if this is RFB protocole
    if (strncmp(protocol_ver,"RFB", 3)!=NULL)
        return FALSE;

    // Check viewer's the protocol version
    int major, minor;
    sscanf((char *)&protocol_ver, rfbProtocolVersionFormat, &major, &minor);
    if (major != rfbProtocolMajorVersion)
        return FALSE;

    // TODO: Maybe change this UltraVNC specific minor value because
    // TightVNC viewer uses minor = 5 ...
    // For now:
    // UltraViewer always sends minor = 4 (sf@2005: or 6, as it returns the minor version received from the server)
    // UltraServer sends minor = 4 or minor = 6
    // m_ms_logon = false; // For all non-UltraVNC logon compatible viewers
    m_ms_logon = m_server->MSLogonRequired();
    vnclog.Print(LL_INTINFO, VNCLOG("m_ms_logon set to %s"), m_ms_logon ? "true" : "false");
    //SC
    if (minor == 4 || minor == 6) m_client->SetUltraViewer(true);
    else if ((minor ==14 || minor ==16)&& SPECIAL_SC_PROMPT)
    {
        m_client->SetUltraViewer(true);
        char mytext[1024];
        getinfo(mytext);
        int size=strlen(mytext);
        if (!m_socket->SendExact((char *)&size, sizeof(int)))
        return FALSE;
        if (!m_socket->SendExact((char *)mytext, size))
        return FALSE;
        int nummer;
        if (!m_socket->ReadExact((char *)&nummer, sizeof(int)))
        {
            return FALSE;
        }
        if (nummer==0) return FALSE;
    }
    else m_client->SetUltraViewer(false); // sf@2005 - Fix Open TextChat from server bug
    return TRUE;
}
阅读(3357) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~