using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System:
ata;
using namespace System:
rawing;
using namespace System::IO;
using namespace System::Text;
using namespace System::Runtime::InteropServices;
using System::Net:
ockets::NetworkStream;
using System::Net:
ockets::TcpClient;
using System::IO:
treamReader;
using namespace System::Net;
__gc public class MsnLib
{
public:
MsnLib(void)
: m_pServer(NULL)
, m_pNs(NULL)
{
}
protected:
private:
/// <summary>
/// 必需的设计器变量。
/// </summary>
/// <summary>
/// 设计器支持所需的方法 - 不要用代码编辑器
///修改此方法的内容。
/// </summary>
public:
// 根据指定的服务器的地址和端口访问MSN 的服务器
int ConnectMsnServer(String* sMsnServerName, int iMsnPort)
{
m_pServer = new TcpClient(sMsnServerName,iMsnPort);
return 0;
}
int ConnectMsnServer(String* sMsnServerName)
{
//这种连接是将服务器地址和段口绑定
String* split[] = 0;
String *strDelimeter=":";
split=sMsnServerName->Split(strDelimeter->ToCharArray());
sMsnServerName=split[0];
int iMsnPort=Convert::ToInt16(split[1]);
m_pServer = new TcpClient(sMsnServerName,iMsnPort);
return 0;
}
// 代表当前连接的服务器的句柄
TcpClient* m_pServer;
// 向MSN服务器发送协议中规定的命令控制字
String* SendMsnCmd(String* sCmd)
{
StreamReader * m_RdStrm;
String *sData;
unsigned char sendbytes __gc[];
m_pNs = m_pServer->GetStream();
m_RdStrm = new StreamReader(m_pServer->GetStream());
sData=sCmd->Format("{0}\r\n",sCmd);
sendbytes = ConvertToChar(sData);
m_pNs->Write(sendbytes, 0, sendbytes->get_Length());
sData=m_RdStrm->ReadLine();
return sData;
}
//将字符串转换为 Byte
unsigned char ConvertToChar(String* str) __gc[]
{
IntPtr pPtr;
int len = 0;
unsigned char sendbytes __gc[];
len = str->get_Length();
sendbytes = new unsigned char __gc[len];
pPtr= Marshal:
tringToHGlobalAnsi(str).ToPointer();
Marshal::Copy(pPtr, sendbytes, 0,len);
Marshal::FreeHGlobal(pPtr);
return (sendbytes);
}
// 对TCP进行读取的流变量
NetworkStream* m_pNs;
// 得到SSL字符串
String* getSSLString(String *sPassportName)
{
//USR 3 TWN I example@passport.com
String* sCmd="";
String* sData="";
sCmd=sCmd->Format("USR 3 TWN I {0}",sPassportName);
sData=SendMsnCmd(sCmd);
String *sRet=sData->Substring(0,3);
sRet=sRet->Trim();
if(sRet->Equals("XFR"))
{
//说明当前的登录服务器无法应答,需要更换服务器
String* split[] = 0;
String *strDelimeter=" ";
split=sData->Split(strDelimeter->ToCharArray());
sData=split[3];
return sData;
}
String* split[] = 0;
String *strDelimeter=" ";
split=sData->Split(strDelimeter->ToCharArray());
sData=split[4];
return sData;
}
// 根据Passport和密码以及SSL加密字符串得到登录返回
String* getPassport(String * sPassportName, String * password, String * sSSLString)
{
// Create a new 'Uri' object with the specified string.
Uri* myUri = new Uri(S"https://nexus.passport.com/rdr/pprdr.asp");
// Create a new request to the above mentioned URL.
WebRequest* myWebRequest= WebRequest::Create(myUri);
// Assign the response object of 'WebRequest' to a 'WebResponse' variable.
WebResponse* myWebResponse = myWebRequest->GetResponse();
WebHeaderCollection *webcollect= myWebResponse->get_Headers();
String *sPassportUrlCollection[]=webcollect->GetValues("PassportURLs");
String* split[] = 0;
String *strDelimeter=",";
split=sPassportUrlCollection[0]->Split(strDelimeter->ToCharArray());
String *sPassportUri=split[1];
sPassportUri=sPassportUri->Replace("DALogin=","https://");
HttpWebRequest* myReq =
dynamic_cast<HttpWebRequest*>(WebRequest::Create(sPassportUri));
String *sAuthor="";
sAuthor=sAuthor->Format("Passport1.4 OrgVerb=GET,OrgURL=http%3A%2F%2Fmessenger%2Emsn%2Ecom,sign-in={0},pwd={1},{2}",sPassportName,password,sSSLString);
myReq->Headers->Add("Authorization",sAuthor);
try{
HttpWebResponse* myHttpWebResponse =
dynamic_cast<HttpWebResponse*>(myReq->GetResponse());
if(myHttpWebResponse->StatusCode==HttpStatusCode::OK){
//说明获取Key成功
webcollect= myHttpWebResponse->get_Headers();
String *sKey[]=webcollect->GetValues("Authentication-Info");
split=sKey[0]->Split(strDelimeter->ToCharArray());
String *sKeyString=split[4];
strDelimeter="'";
split=sKeyString->Split(strDelimeter->ToCharArray());
sKeyString=split[1];
return sKeyString;
}
return "null";
}
catch(WebException *e)
{
String *err=e->ToString();
return "null";
}
}
void DisConnect(void)
{
m_pServer->Close();
}
};