⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rogateway.cpp

📁 teamviewer source code vc++
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	//don't check for valid checksum any more - user should see that ID is invalid / mistyped
	//return id > 0 && (id%7 == 0 || id%7 == 1);	// is it a valid ClientID/temporary ClientID?
	return id > 0;
}

bool CroGateway::GatewayRunning()
{
	// m_installed has to be checked to detect if an old version might be running
	if (!m_installed || m_destroying)
		return false;

	/* Check if DynGate is running */
	HANDLE dyngatemutex = OpenMutex(MUTEX_ALL_ACCESS,FALSE,"DynGateInstanceMutex");
	SetLastError(0);				// the error number is not needed, don't log it 

	if (!dyngatemutex)
		return false;	
	else
	{
		CloseHandle(dyngatemutex);
		return true;
	}
}


SOCKET CroGateway::NewSocket()
{
	if (m_destroying)
		return INVALID_SOCKET;

	SOCKET newsock;
	struct sockaddr_in thataddr;
	int res;
	
	newsock = socket(PF_INET, SOCK_STREAM, 0);
	if (newsock == INVALID_SOCKET) 
	{
		vnclog.Print(LL_INTERR,VNCLOG("DynGate NewSocket.NoSocket"));
		return INVALID_SOCKET;
	}

	thataddr.sin_addr.s_addr = inet_addr(GatewayListenHost());
	thataddr.sin_family = AF_INET;
	thataddr.sin_port = htons(GatewayListenPort());
	
	res = connect(newsock, (LPSOCKADDR) &thataddr, sizeof(thataddr));
	if (res == SOCKET_ERROR)
	{
		closesocket(newsock);
		vnclog.Print(LL_INTERR,VNCLOG("DynGate NewSocket ConnectError"));
		// DynGate might hang - kill the process and try again
		KillGateway();
		Sleep(500);
		StartGateway();
		Sleep(1000); // Wait a bit longer with the 2. try...
		return INVALID_SOCKET;
	}
	else
	{
		vnclog.Print(LL_INTINFO, VNCLOG("Connected to DynGate on port %s:%d"), 
			GatewayListenHost(), GatewayListenPort());
		// Immediately send MESSAGETYPE_LOGIN
		// Required by DynGate to detect new protocol version
		SendCommand(MESSAGETYPE_LOGIN, TEAMVIEWER_VERSION, newsock);
		return newsock;
	}
}

bool CroGateway::BeginWaitAtMaster(bool internet)
{
	if (!GatewayInstalled() || m_destroying)
		return false;

	// Already connecting?
	while (m_connecting && !m_destroying)
		Sleep(10);

	if (m_waitingatmaster)
		return true;
	if (m_destroying)
		return false;

	m_connecting = true;

	vnclog.Print(LL_INTINFO,VNCLOG("DynGate WaitAtMaster"));

	/* Check if DynGate is running, if not, startup */
	if (!GatewayRunning())
	{
		// Start DynGate
		StartGateway();
		Sleep(500);
	}

	if(m_sock != INVALID_SOCKET)
		closesocket(m_sock);
	m_sock = NewSocket();

	m_connecting = false;

	if (m_sock != INVALID_SOCKET && menu && menu->m_server)
	{
		m_waitingatmaster = true;
		stringstream ss;
		ss << VNCCONNECTPORT << ":" << menu->m_server->GetPort();
		string s = ss.str();
		SendCommand(MESSAGETYPE_SEND, s);
		vnclog.Print(LL_INTINFO, VNCLOG("BeginWaitAtMaster send %s"), s.c_str());
		return true;
	}
	else
		return false;
}

void CroGateway::EndWaitAtMaster(char *lor /*=NULL*/)
{
	vnclog.Print(LL_INTINFO,VNCLOG("DynGate EndWaitAtMaster"));

	if (m_waitingatmaster && m_sock != INVALID_SOCKET) 
	{
		// Send logout-reason so DynGate can decide what to do next
		SendCommand(MESSAGETYPE_LOGOUT, string(lor));
		Sleep(500);
		m_waitingatmaster = false;
		shutdown(m_sock, 2);
		closesocket(m_sock);
		m_sock = INVALID_SOCKET;
	}
}

SOCKET CroGateway::ConnectOverGateway(char *destClient)
{
	if (m_destroying)
		return INVALID_SOCKET;

	vnclog.Print(LL_INTINFO,VNCLOG("DynGate Connect to %s"),destClient);
	SOCKET newsock = NewSocket();
	//Sleep(500);
	if(newsock!=INVALID_SOCKET && SendCommand(MESSAGETYPE_CONNECT, string(destClient), newsock))
		return newsock;
	else
		return INVALID_SOCKET;	
}

void CroGateway::ShowFreeUpgradeDialog()
{
	SendCommand(MESSAGETYPE_DIALOG, "");
}

// Close DynGate
void CroGateway::Shutdown()
{
	if (IsServer() || IsVPN() || !GatewayRunning())			// Don't shut down servers
		return; 

	vnclog.Print(LL_INTINFO,VNCLOG("DynGate Shutdown"));

	HWND h=FindWindow(NULL,"DynGate");

	if (h)
		PostMessage(h,WM_COMMAND,4030,0); // CS: 4030 is ID_CLOSE in DynGate, which is a custom defined command
	m_waitingatmaster = false;
}

// Show dialogs
void CroGateway::ShowOptions()
{
	HWND h=FindWindow(NULL,"DynGate");

	if (h)
		PostMessage(h,WM_COMMAND,4027,0); 
}

void CroGateway::ShowActivateLicense()
{
	HWND h=FindWindow(NULL,"DynGate");

	if (h)
		PostMessage(h,WM_COMMAND,4035,0); 
}

void CroGateway::ShowConnectivity()
{
	HWND h=FindWindow(NULL,"DynGate");

	if (h)
		PostMessage(h,WM_COMMAND,4038,0); 
}

void CroGateway::PostServiceHelperMessage(long processId)
{
	HWND dynGate = FindWindow(NULL,"DynGate");
	const int WM_SERVICE_HELPER=4037;
	// Staudenmeyer this seems to have changed
	PostMessage(dynGate,WM_COMMAND,WM_SERVICE_HELPER,0);
}

void CroGateway::StartGateway()
{
	if (m_destroying || m_noRestart)
		return;

	vnclog.Print(LL_INTINFO,VNCLOG("DynGate Startup from %s"),m_installpath);

	if (!GatewayRunning())
	{
		// Start DynGate
		if (isQSCustom)
			int i = (int)ShellExecute(NULL, "open", m_installpath,"-qsc2",0,SW_SHOW); // v2: No registry required
		else if (isQuickSupport)
			int i = (int)ShellExecute(NULL, "open", m_installpath,"-qs2",0,SW_SHOW); // v2: No registry required
		else if (isNoSave) // TeamViewer Portable
			int i = (int)ShellExecute(NULL, "open", m_installpath,"-nosave",0,SW_SHOW);
		else
			int i = (int)ShellExecute(NULL, "open", m_installpath,0,0,SW_SHOW);
	}
}

// Kill DynGate (only required if process hangs)
void CroGateway::KillGateway(bool noRestart /*=false*/)
{
	vnclog.Print(LL_INTWARN,VNCLOG("DynGate KillGateway"));
	if (noRestart)
	{
		m_noRestart = true;
	}

	CKillProcess kp;
	// Get name of exe
	char name[100];
	char *pos = strrchr(m_installpath,'\\');
	if(pos)
	{
		strcpy(name, pos+1);
		kp.KillProcess(name);
	}
}

bool CroGateway::PollDynGate()
{
	if (m_polling || m_destroying)
		return false;

	if(!NumericID())
		vnclog.Print(LL_INTINFO, VNCLOG("PollDynGate()"));
	m_polling = true;

	TIMEVAL waitval;
	fd_set socks;
	int bytes, received, socketsready;
	_roGatewayData msg;
	char *buffer = NULL;

	memset(&waitval, 0, sizeof(waitval));
	//waitval.tv_sec  = 1;
	//waitval.tv_usec = 0;  // Mikrosekunden
	FD_ZERO(&socks);
	FD_SET(m_sock, &socks);
	
	string oldClientID = m_Variables[CLIENTID];
	string oldVersion = m_Variables[VERSION];
	string oldLicense = m_Variables[LICENSETYPE];

	while( (socketsready = select(0, &socks, 0, &socks, &waitval)) > 0)
	{
		bytes = sizeof(msg);
		received = recv(m_sock, (char*)&msg, bytes, 0);
		if(received == SOCKET_ERROR)
		{
			vnclog.Print(LL_SOCKERR, VNCLOG("1. recv() error DynGate"));
			goto reconnect;
		}
		if(received != bytes)
		{
			vnclog.Print(LL_SOCKERR, VNCLOG("1. recv() %d bytes received, %d expected"), received, bytes);
			goto reconnect;
		}

		if(msg.ParamLength == 0)
		{
			m_polling = false;
			return true;
		}

		// Win98: FD struct is reset, so set it again
		FD_ZERO(&socks);
		FD_SET(m_sock, &socks);
		if(select(0, &socks, 0, &socks, &waitval) == SOCKET_ERROR)
		{
			vnclog.Print(LL_SOCKERR, VNCLOG("2. select() DynGate"));
			goto reconnect;
		}

		bytes = msg.ParamLength;
		buffer = new char[bytes+1];
		buffer[bytes] = '\0';
		received = recv(m_sock, buffer, bytes, 0);
		if(received == SOCKET_ERROR)
		{
			vnclog.Print(LL_SOCKERR, VNCLOG("2. recv() error DynGate"));
			goto reconnect;
		}
		if(received != bytes)
		{
			vnclog.Print(LL_SOCKERR, VNCLOG("2. recv() %d bytes received, %d expected"), received, bytes);
			goto reconnect;
		}
		if(!NumericID())
			vnclog.Print(LL_INTINFO, VNCLOG("received %d bytes "), received);

		switch(msg.MessageType)
		{
			case MESSAGETYPE_SEND:
				char *pos = strchr(buffer, ':');
				if(!pos)
					break;
				string value = string(pos+1);
				*pos = '\0';
				string key = string(buffer);
				m_Variables[key] = value;
				break;
		}
		if(buffer)
		{
			delete []buffer;
			buffer = NULL;
		}

		// Win98: FD struct is reset, so set it again
		FD_ZERO(&socks);
		FD_SET(m_sock, &socks);
	}
	if(!NumericID())
		vnclog.Print(LL_INTINFO, VNCLOG("socketsready = %d"), socketsready);

	if(socketsready == SOCKET_ERROR)
	{
		vnclog.Print(LL_SOCKERR, VNCLOG("1. select() DynGate"));
		goto reconnect;
	}

	if(oldClientID != m_Variables[CLIENTID] ||
	   oldVersion != m_Variables[VERSION] ||
	   oldLicense != m_Variables[LICENSETYPE])
	{
		TeamviewerInfo::setLocalInfo(tvID, m_Variables[CLIENTID]);
		vnclog.Print(LL_INTINFO, VNCLOG("DynGate: ID=%s Version=%s License=%s"), 
			m_Variables[CLIENTID].data(), m_Variables[VERSION].data(), m_Variables[LICENSETYPE].data());
	}

	m_polling = false;
	return true;

reconnect:
	if(buffer)
		delete []buffer;
	Reconnect();
	m_polling = false;
	return false;
}

void CroGateway::Reconnect()
{
	m_waitingatmaster = false;
	shutdown(m_sock, 2);
	closesocket(m_sock);
	m_sock = INVALID_SOCKET;
	BeginWaitAtMaster(true);
}


bool CroGateway::SendCommand(int msgtype, string param, SOCKET sock /* =INVALID_SOCKET */)
{
	if (m_destroying)
		return false;

	if(sock == INVALID_SOCKET)
		sock = m_sock;

	if (sock == INVALID_SOCKET)
	{
		vnclog.Print(LL_SOCKERR, VNCLOG("SendCommand invalid socket"));
		return false;
	}

	_roGatewayData msg;
	msg.MessageType = msgtype;
	msg.ParamLength = param.length();
	
	int buflen = sizeof(msg) + msg.ParamLength;
	char *buffer = new char[buflen];
	memcpy(buffer, &msg, sizeof(msg));
	memcpy(buffer+sizeof(msg), param.data(), msg.ParamLength);
	int sent = send(sock, buffer, buflen, 0);

	delete []buffer;

	if(sent != buflen)
	{
		vnclog.Print(LL_SOCKERR, VNCLOG("send() result=%d, should be %d"), sent, buflen);
		Reconnect();
		return false;
	}
	return true;
}

std::string CroGateway::getLicenseName()
{
	return m_Variables[LICENSENAME];
}

bool CroGateway::QueryClientID()
{ 
	if(!NumericID())
		vnclog.Print(LL_INTINFO, VNCLOG("SendCommand(MESSAGETYPE_REQUESTSETTINGS)"));
	return SendCommand(MESSAGETYPE_REQUESTSETTINGS, "");
}

void CroGateway::HostMode(bool hostmode)
{
	if (hostmode)
		SendCommand(MESSAGETYPE_SEND, "HostMode:1");
	else
		SendCommand(MESSAGETYPE_SEND, "HostMode:0");
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -