?? msnloginclient.cpp
字號:
// 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是參數(shù),
//[ ]內(nèi)是可選項。最簡單的命令沒有流水號和參數(shù)。
//為了方便起見,下面討論時用" "代表<SP>,"\r\n"代表<CRLF>,
//"\x??"代表一個值為0x??字節(jié)。
//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->[聯(lián)系人: 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發(fā)送一個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 服務器發(fā)出驗證要求..");
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 :獲取聯(lián)系人(組列表)請求的應答!");
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -