接上一篇文章,下面的代码是处理版本信息的。
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) |