📄 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是参数,
//[ ]内是可选项。最简单的命令没有流水号和参数。
//为了方便起见,下面讨论时用" "代表<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 + -