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

📄 msnloginclient.cpp

📁 网络编程
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// CMsnLoginClient.cpp : implementation file
//

#include "stdafx.h"
#include "SimMsnMessenger.h"
#include "SimMsnMessengerView.h"
#include "MsnLoginClient.h"
#include "MsnSocket.h"

#include <afxinet.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern char  agCurDir[];
/////////////////////////////////////////////////////////////////////////////
// CMsnLoginClient

CMsnLoginClient::CMsnLoginClient( )
{
	//m_pView		= pView;
	 
	m_pSocket	= NULL;
	m_strCurChannel =	CString("");
	m_strHostIPAddress = CString("");
	m_strServerName =		CString("");
	m_strMyNickName =		CString("");

	m_strClientMsg =  CString("");
	m_strRecvMsg = CString("NULL");

	m_strlstDisplay.RemoveAll();
	m_iSendXh=1;
	m_iLoginOk=0;
	m_iCountUser=0;
	m_iXfrSbUserNo=99999;
}

CMsnLoginClient::~CMsnLoginClient()
{
	if(m_pSocket != NULL) 
	{
		FileLog("->断开服务器连接!");
		m_pSocket->ShutDown(2);
		m_pSocket->Close();
		delete m_pSocket;
		m_pSocket = NULL;
	}

}

void CMsnLoginClient::Init()
{

	//build the socket link
	//FileLog("Socket connect :[%s,%d]",m_strServerName,6667); 
	if( !ClientConnectSocket(m_strServerName,1863) )  //connect the default server
	{
		FileLog("Socket connect  Error"); 
	}

	if(m_pSocket == NULL) return;
	 
}

 
 



void CMsnLoginClient::DoPrivmsg(LPCSTR lpszWho,LPCSTR lpszMessage)
{
	char	buf[512];
	int		iTem;

	//the message len is must less 510
	if(strlen(lpszMessage) > 510)
	{
		buf[510] = '\0';
		buf[511] = '\0';
	}

	//check the lpszWho , if the string is: "#chinese"  --> "chinese"

	if(m_pSocket == NULL) return;
	sprintf(buf, "PRIVMSG %s :%s",lpszWho,lpszMessage);
	iTem = strlen(buf);
	buf[iTem] = 0x0d;
	buf[iTem+1] = 0x0a;
	buf[iTem+2] = 0x00;
	m_pSocket->Send( (void*)buf, strlen(buf));

}

BOOL CMsnLoginClient::ClientConnectSocket(LPCTSTR lpszHostname,UINT nPort)
{
	char	buf[512];
	int		iTem;
	int     iConTimes=0;
	
	m_pSocket = new CMsnSocket(this);

	FileLog("->开始连接到服务器[%s,%d] ...... ",lpszHostname,nPort);
	if (!m_pSocket->Create())
	{
		//??
		m_pSocket->Close();

		//??? 1998-07-21 closesocket();
		delete m_pSocket;
		m_pSocket = NULL;
		FileLog("CMsnLoginClient::ClientConnect ->SocketSocket Create Error");
		return FALSE;
	}
	iConTimes++;
	while(!m_pSocket->Connect(lpszHostname, nPort) )
	{
		iConTimes++;
		FileLog("->尝试第%d次连接到服务器[%s,%d] ......",iConTimes,lpszHostname,nPort);
		//一但不成功,server 端的 nPort 口就被占用而 cbkcomsrv cannot startup ?????
		if (AfxMessageBox("ReConnect again?",MB_YESNO) == IDNO)
		{
			m_pSocket->Close();
			
			//??? 1998-07-21 closesocket();
			delete m_pSocket;
			m_pSocket = NULL;
			CString strTmp;
			strTmp.Format( "Socket connect[%s:%d] fail!",lpszHostname, nPort) ;
			AfxMessageBox(strTmp);
		
			return FALSE;
		}

	}

	//AfxMessageBox("Socket connect successfully");

	//Init:
	m_pSocket->m_pFile = new CSocketFile(m_pSocket);
	m_pSocket->m_pArchiveIn = new CArchive(m_pSocket->m_pFile,CArchive::load);
	m_pSocket->m_pArchiveOut = new CArchive(m_pSocket->m_pFile,CArchive::store);


	//Connect the host:
	//send the nickname:
	m_iSendXh++;
	sprintf( buf,"VER %d MSNP9 MSNP8 CVR0",m_iSendXh);
	iTem = strlen(buf);
	buf[iTem] = 0x0d;
	buf[iTem+1] = 0x0a;
	buf[iTem+2] = 0x00;
 
	m_pSocket->Send( (void*)buf, strlen(buf));

	CString strTemp;
	//m_pSocket->GetSockName( m_pSocket->m_strIPAddress, m_pSocket->m_uPort );
	
	return TRUE;
}


void CMsnLoginClient::ParseRecvedStr(CString strMsg)
{
	 
	CString strPrefix,strCommand,strParams;
	CString strTem,strTem2;
	CString strChannel,strWhoTalkToMe;

	char	buf[500];
	int		iTem;
	char alTmp0[1000],alTmp1[100],alTmp2[100],alTmp3[100],alTmp4[1000],alTmp5[1000],alTmp6[1000],alTmp7[1000];
	unsigned int i=0;
	
    FileLog("Parse[%s]",(LPCTSTR)strMsg);
	//MSN Messenger命令使用纯ASCII码。对非ASCII码字符使用URL编码。
	//命令的语法是
	//XXX[<SP>TrID<SP>PARAM1<SP>PARAM2…]<CRLF>
	//其中,<SP>是空白字符,<CRLF>是回车换行,
	//XXX是一个3字符的命令串,TrID是一个流水号,PARAMx是参数,
	//[ ]内是可选项。最简单的命令没有流水号和参数。
	//为了方便起见,下面讨论时用" "代表<SP>,"\r\n"代表<CRLF>,
	//"\x??"代表一个值为0x??字节。
	//USR 18 TWN I example@hotmail.com\r\n

	strCommand = strMsg.Mid(0,3);
	if(strCommand == CString("VER"))
	{
		memset(buf,0x00,sizeof(buf));
		m_iSendXh++;
		sprintf(buf, "CVR %d 0x0409 winnt 5.1 i386 MSNMSGR 6.0.0602 MSMSGS %s",m_iSendXh,(LPCTSTR)m_strMyNickName);
		iTem = strlen(buf);
		buf[iTem] = 0x0d; buf[iTem+1] = 0x0a; buf[iTem+2] = 0x00;
		m_pSocket->Send( (void*)buf, strlen(buf));
 	}
	else if(strCommand == CString("CVR"))
	{
		memset(buf,0x00,sizeof(buf));
		m_iSendXh++;
		sprintf(buf, "USR %d TWN I %s",m_iSendXh ,(LPCTSTR)m_strMyNickName);
		iTem = strlen(buf);
		buf[iTem] = 0x0d; buf[iTem+1] = 0x0a; buf[iTem+2] = 0x00;
		m_pSocket->Send( (void*)buf, strlen(buf));
 	}
	else if(strCommand == CString("XFR"))
	{
		//XFR 3 NS 207.46.107.104:1863 0 207.46.104.20:1863%0d%0a
		 
		memset(alTmp0,0x00,sizeof(alTmp0));
		memset(alTmp1,0x00,sizeof(alTmp1));
		memset(alTmp2,0x00,sizeof(alTmp2));
		memset(alTmp3,0x00,sizeof(alTmp3));
		memset(alTmp4,0x00,sizeof(alTmp4));
		memset(alTmp5,0x00,sizeof(alTmp5));
		memset(alTmp6,0x00,sizeof(alTmp6));
		
		sprintf(alTmp0,"%s",(LPCTSTR)strMsg);
		sscanf(alTmp0,"%s %s %s %s %s %s",alTmp1,alTmp2,alTmp3,alTmp4,alTmp5,alTmp6);
		FileLog("XFR: %s %s %s %s %s %s",alTmp1,alTmp2,alTmp3,alTmp4,alTmp5,alTmp6);
		
		unsigned int ilLen=strlen(alTmp4);

		for( i=2; i < ilLen ; i++ ) 
		{
			if( alTmp4[i]== ':' ) break;
		}
		alTmp4[i]=0x00;

		m_strServerName.Format("%s",alTmp4);

		if( memcmp(alTmp3,"NS",2 ) == 0 )
		{
			FileLog("PostMessage(WPARAM, LPARAM lParam)");
			AfxGetApp()->m_pMainWnd->PostMessage( WM_MY_MESSAGE, 0, 0 );
		}
		else if( memcmp(alTmp3,"SB",2 ) == 0 )
		{
			FileLog("XFR SB  返回分配SS请求的应答");
			//XFR+13+SB+207.46.108.46:1863+CKI+52265.1116983946.14855
			if( m_iXfrSbUserNo < m_iCountUser )
			{
				
				FileLog("XFR SB:NS->[联系人: i=[%d](%s) ...]", m_iXfrSbUserNo,(LPCTSTR)m_MsnUser[m_iXfrSbUserNo]->m_strEmail );
				m_MsnUser[m_iXfrSbUserNo]->m_strSessionID.Format("%s",alTmp1);
				m_MsnUser[m_iXfrSbUserNo]->SBInit(alTmp4,alTmp6);
			}
			m_iXfrSbUserNo=99999;
		}
	 
 	}
	else if(strCommand == CString("USR"))
	{
		//USR 7 TWN S lc=1033,id=507,tw=40,fs=1,ru=http%3A%2F%2Fmessenger%2Emsn%2Ecom,ct=1116208791,kpp=1,kv=6,ver=2.1.6000.1,tpf=3dc9e50a9b371f27a912e60c0fa95a62
 
		memset(alTmp0,0x00,sizeof(alTmp0));
		memset(alTmp1,0x00,sizeof(alTmp1));
		memset(alTmp2,0x00,sizeof(alTmp2));
		memset(alTmp3,0x00,sizeof(alTmp3));
		memset(alTmp4,0x00,sizeof(alTmp4));
		memset(alTmp5,0x00,sizeof(alTmp5));

		sprintf(alTmp0,"%s",(LPCTSTR)strMsg);
		sscanf(alTmp0,"%s %s %s %s %s",alTmp1,alTmp2,alTmp3,alTmp4,alTmp5);
		FileLog("USR : %s %s %s %s",alTmp1,alTmp2,alTmp3,alTmp4,alTmp5);
		
		//USR 7 OK tcpip_2005@126.com tcpip_2005@126.com 1 0 \r\n 
		if( memcmp( alTmp3 ,"OK", 2) == 0 )
		{
			FileLog("MSN Login OK !");
			m_iLoginOk=1;
			m_strNick.Format("%s", alTmp5 );
			//SYN+8+0%0d%0a
				memset(buf,0x00,sizeof(buf));
				m_iSendXh++;
				sprintf(buf, "SYN %d 0",m_iSendXh );
				iTem = strlen(buf);
				buf[iTem] = 0x0d; buf[iTem+1] = 0x0a; buf[iTem+2] = 0x00;
				m_pSocket->Send( (void*)buf, strlen(buf));

			return ;
		}
		else if( memcmp( alTmp3 ,"TWN", 3) == 0 )
		{
			FileLog("MSN 通过SSL的认证 ... ");
			
		}

		//通过SSL的认证过程如下: 

		//首先在HTTPS端口443向login.passport.com发送一个GET请求,
		//将账号、密码和NS给定的一长串信息送出 
		memset(alTmp4,0x00,sizeof(alTmp4));
		int ilRet;
		ilRet = DoHTTPSAuthentication(alTmp5,alTmp4);
		//在服务器认证成功的返回信息中,
		//Authentication-Info字段的from-PP串值,就是所谓的“入场券”。 
		if( ilRet == 0 )
		{
				memset(buf,0x00,sizeof(buf));
				m_iSendXh++;
				sprintf(buf, "USR %d TWN S %s",m_iSendXh,alTmp4 );
				iTem = strlen(buf);
				buf[iTem] = 0x0d; buf[iTem+1] = 0x0a; buf[iTem+2] = 0x00;
				m_pSocket->Send( (void*)buf, strlen(buf));
		}
		else
		{
			//如果认证失败,服务器返回401错误 
			FileLog("如果认证失败,服务器返回401错误");
		}

	}
	else if(strCommand == CString("SYN"))
	{
		
		FileLog("SYN ...");
		// CHG+9+NLN+268435492%0d%0a]
		memset(buf,0x00,sizeof(buf));
		m_iSendXh++;
		sprintf(buf, "CHG %d NLN 268435492",m_iSendXh );
		iTem = strlen(buf);
		buf[iTem] = 0x0d; buf[iTem+1] = 0x0a; buf[iTem+2] = 0x00;
		m_pSocket->Send( (void*)buf, strlen(buf));

	}
	else if(strCommand == CString("CHG"))
	{
	 
		//[BLP+10+BL%0d%0aXFR+11+SB%0d%0a]

	 	memset(buf,0x00,sizeof(buf));
		m_iSendXh++;
		sprintf(buf, "BLP %d BL",m_iSendXh );
		iTem = strlen(buf);
		buf[iTem] = 0x0d; buf[iTem+1] = 0x0a; buf[iTem+2] = 0x00;
		m_pSocket->Send( (void*)buf, strlen(buf));
		DispMainPage();

	}
	else if(strCommand == CString("CHL"))
	{
		 
		//CHL+0+84992517860471275122%0d%0a]
	    //QRY+12+PROD0038W!61ZTF9+32%0d%0a23036a07c59a61ea54bf64930ee3689d]
		FileLog("CHL 服务器发出验证要求..");
		
		memset(alTmp0,0x00,sizeof(alTmp0));
		memset(alTmp1,0x00,sizeof(alTmp1));
		memset(alTmp2,0x00,sizeof(alTmp2));
		memset(alTmp3,0x00,sizeof(alTmp3));
		memset(alTmp4,0x00,sizeof(alTmp4));
	 
		sprintf(alTmp0,"%s",(LPCTSTR)strMsg);
		sscanf(alTmp0,"%s %s %s",alTmp1,alTmp2,alTmp3 );
		FileLog("CHL : %s %s %s",alTmp1,alTmp2,alTmp3 );
		DoMD5( alTmp3, alTmp4 );
		memset(buf,0x00,sizeof(buf));
		m_iSendXh++;
		sprintf(buf, "QRY %d PROD0038W!61ZTF9 32\r\n%s",m_iSendXh ,alTmp4);
		iTem = strlen(buf);
		buf[iTem] = 0x00;
		m_pSocket->Send( (void*)buf, strlen(buf));

	}
	else if(strCommand == CString("LSG"))
	{
	 
		FileLog("LSG :获取联系人(组列表)请求的应答!");

⌨️ 快捷键说明

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