- 论坛徽章:
- 0
|
接上一篇文章,下面的代码是处理版本信息的。 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; }
|
|