www.pudn.com > HTTP协议分析器开发源码.rar > mainfrm.cpp


//Author:Mr. Davens Email:333@ywetrade.com master@ywetrade.com 
//If you have any program ,Pleade feel free to contact with me ...:) thanks 
// MainFrm.cpp : implementation of the CMainFrame class 
// 
 
#include "stdafx.h" 
#include "BPON.h" 
#include "MainFrm.h" 
#include "BPONDoc.h" 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
int nThreadCount = 0; 
int iCounter=-2; 
int IsStop = 0; 
CBPONView*  pBPOView; 
CEditView1* pEditView1; 
///////////////////////////////////////////////////////////////////////////// 
// CMainFrame 
 
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd) 
 
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) 
	//{{AFX_MSG_MAP(CMainFrame) 
	ON_WM_CREATE() 
	ON_BN_CLICKED(IDC_POSONE, OnPosone) 
	ON_COMMAND(ID_MPO, OnMpo) 
	ON_COMMAND(ID_STOP, OnStop) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
static UINT indicators[] = 
{ 
	ID_SEPARATOR,           // status line indicator 
	ID_INDICATOR_CAPS, 
	ID_INDICATOR_NUM, 
	ID_INDICATOR_SCRL, 
}; 
 
///////////////////////////////////////////////////////////////////////////// 
// CMainFrame construction/destruction 
 
CMainFrame::CMainFrame() 
{ 
	// TODO: add member initialization code here 
	 
} 
 
CMainFrame::~CMainFrame() 
{ 
 
} 
 
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{ 
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1) 
		return -1; 
	 
	if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP 
		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || 
		!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) 
	{ 
		TRACE0("Failed to create toolbar\n"); 
		return -1;      // fail to create 
	} 
 
	if (!m_wndStatusBar.Create(this) || 
		!m_wndStatusBar.SetIndicators(indicators, 
		  sizeof(indicators)/sizeof(UINT))) 
	{ 
		TRACE0("Failed to create status bar\n"); 
		return -1;      // fail to create 
	} 
 
	// TODO: Delete these three lines if you don't want the toolbar to 
	//  be dockable 
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); 
	EnableDocking(CBRS_ALIGN_ANY); 
	DockControlBar(&m_wndToolBar); 
 
	// Initialize dialog bar m_wndMyDialogBar 
	if (!m_wndMyDialogBar.Create(this, IDD_ONEURL, 
			CBRS_TOP | CBRS_HIDE_INPLACE, 
			ID_ONEURL)) 
		{ 
			TRACE0("Failed to create dialog bar m_wndMyDialogBar\n"); 
			return -1;		// fail to create 
		} 
 
		m_wndMyDialogBar.EnableDocking(CBRS_ALIGN_TOP | CBRS_ALIGN_BOTTOM); 
		EnableDocking(CBRS_ALIGN_ANY); 
		DockControlBar(&m_wndMyDialogBar); 
		m_wndMyDialogBar.SetDlgItemText(IDC_URLONE,"http://www.ywetrade.com"); 
		GetOneUrl(); 
	return 0; 
} 
 
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/, 
	CCreateContext* pContext) 
{ 
	if(!m_wndSplitter.CreateStatic(this,2,1,WS_CHILD|WS_VISIBLE))//.行.列 
	return false;//不成功就返回 
	else 
	{ 
	m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CEditView1),CSize(100,100),pContext);//0行0列窗格上 提示信息在此显示 
	// CStateView和CMsgView是自己定义的视图类。 
	//CSize(100,300)是初始化时的大小 
	if(m_wndSplitter2.CreateStatic(&m_wndSplitter,1,2,WS_CHILD|WS_VISIBLE, m_wndSplitter.IdFromRowCol(1, 0))==NULL)  
	return FALSE; //将第1行0列再分开1行2列 
 
	//连接到第二个分栏对象的1行0列  
	m_wndSplitter2.CreateView(0,0,RUNTIME_CLASS(CEditView2),CSize(200,200),pContext); 
	//连接到第二个分栏对象的1行1列 //返回信息在此显示 
	m_wndSplitter2.CreateView(0,1,RUNTIME_CLASS(CBPONView),CSize(0,0),pContext); 
	 
	return TRUE;//成功的返回值 
	}    
} 
 
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	if( !CFrameWnd::PreCreateWindow(cs) ) 
		return FALSE; 
	// TODO: Modify the Window class or styles here by modifying 
	//  the CREATESTRUCT cs 
 
	return TRUE; 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CMainFrame diagnostics 
 
#ifdef _DEBUG 
void CMainFrame::AssertValid() const 
{ 
	CFrameWnd::AssertValid(); 
} 
 
void CMainFrame::Dump(CDumpContext& dc) const 
{ 
	CFrameWnd::Dump(dc); 
} 
 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CMainFrame message handlers 
 
CString CMainFrame::GetOneUrl()   ///取得单发URL。。。。 
{ 
    CString str; 
	m_wndMyDialogBar.GetDlgItemText(IDC_URLONE,str); 
	return str; 
} 
 
void CMainFrame::OnPosone()  ///发送单URL。。。。 
{ 
	CString url = GetOneUrl(); 
	CBPOParaClass::ONEURL_INFO* pInfo = new (CBPOParaClass::ONEURL_INFO); 
	pInfo->url = url; 
	TRACE(pInfo->url); 
	CBPOThread* pThread=new CBPOThread("GOOD"); 
	pInfo->pThread = pThread; 
	CWinThread* PosOneT=NULL; 
	if(PosOneT=AfxBeginThread(pThread->StartPosOneUrl,pInfo,THREAD_PRIORITY_NORMAL, 
		0,CREATE_SUSPENDED,NULL)) 
	{ 
		nThreadCount++; 
		TRACE("单网址发送\r\n"); 
		PosOneT->ResumeThread(); 
 
	}   
	TRACE("线程建立,发送中。。。\r\n"); 
	Sleep(500); 
	delete pInfo; 
	delete pThread; 
} 
///////////////////////////////////////////////////////////////////////////////////// 
/////////////////////////////////////////////////////////////////////////////////// 
 
// BPOThread.cpp : implementation file 
 
///////////////////////////////////////////////////////////////////////////// 
// CBPOThread 
 
IMPLEMENT_DYNCREATE(CBPOThread, CWinThread) 
 
CBPOThread::CBPOThread() 
{ 
} 
 
CBPOThread::~CBPOThread() 
{ 
} 
 
BOOL CBPOThread::InitInstance() 
{ 
	// TODO:  perform and per-thread initialization here 
	return TRUE; 
} 
 
int CBPOThread::ExitInstance() 
{ 
	// TODO:  perform any per-thread cleanup here 
	return CWinThread::ExitInstance(); 
} 
 
BEGIN_MESSAGE_MAP(CBPOThread, CWinThread) 
	//{{AFX_MSG_MAP(CBPOThread) 
		// NOTE - the ClassWizard will add and remove mapping macros here. 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CBPOThread message handlers 
 
UINT CBPOThread::StartPosOneUrl(LPVOID lParam) //单发线程函数。。。 
{ 
	CBPOParaClass::ONEURL_INFO* pInfo = (CBPOParaClass::ONEURL_INFO*)lParam; 
		TRACE(pInfo->url); 
 
	CBPOThread* pThis=(CBPOThread*)(pInfo->pThread); 
	return pThis->PosOneUrl(pInfo); 
} 
 
UINT CBPOThread::PosOneUrl(LPVOID lParam) 
{ 
	CBPOParaClass::ONEURL_INFO* Info = (CBPOParaClass::ONEURL_INFO*)lParam; 
	TRACE(Info->url); 
	CString url = Info->url; 
 
//	CBPOThread* pThread=(CBPOThread*)(Info->pThread); 
	TRACE("HERE IS good GOOD!\r\n"); 
	CHTTPSocket CS; 
	CS.Request(url,"?"); 
	return 0; 
} 
 
UINT CBPOThread::StartMPO(LPVOID lParam) 
{ 
	CBPOParaClass::MPO_INFO* mmInfo = (CBPOParaClass::MPO_INFO*)lParam; 
	CBPOThread* pThis=(CBPOThread*)(mmInfo->pThread); 
	return pThis->MPO(mmInfo); 
} 
 
UINT CBPOThread::MPO(LPVOID lParam) 
{ 
	CBPOParaClass::MPO_INFO* mInfo = (CBPOParaClass::MPO_INFO*)lParam; 
//	CBPOThread* pThread=(CBPOThread*)(Info->pThread); 
	CHTTPSocket CS; 
	//在内部重新打开 
	HANDLE hCounterIn=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"sam sp 44"); 
	WaitForSingleObject(hCounterIn,INFINITE); 
    iCounter+=2;         //全局变量。。。。。 
	ReleaseMutex(hCounterIn); 
	CloseHandle(hCounterIn); 
 
	CString sztmp; 
	if (iCounter+1>mInfo->urllist.GetSize())  //防止超出范围。。 
		return 0; 
	sztmp = mInfo->urllist.GetAt(iCounter+1);  // 
	/////////////加入信息。。。换掉TXT文档中的代号。。。(效率不好!寻找替代方案) 
	sztmp.Replace("NNN",mInfo->m_msg.user); 
	sztmp.Replace("PPP",mInfo->m_msg.pass); 
	sztmp.Replace("EEE",mInfo->m_msg.email); 
	sztmp.Replace("UUU",mInfo->m_msg.url); 
	sztmp.Replace("TTT",mInfo->m_msg.tele); 
	sztmp.Replace("MMM",mInfo->m_msg.mean); 
	sztmp.Replace("SSS",mInfo->m_msg.subj); 
	sztmp.Replace("CCC",mInfo->m_msg.cont);  
    //////发送。。。。。 
//	TRACE(sztmp); 
	CS.Request(mInfo->urllist.GetAt(iCounter),sztmp);  // 
 
	return 0; 
} 
 
UINT CBPOThread::Sniff(LPVOID lParam) 
{ 
	CBPOParaClass::Sniff_INFO* pInfo = (CBPOParaClass::Sniff_INFO*)lParam; 
	LPPACKET lpPacket; 
	char       buffer[256000]; 
	struct     bpf_stat stat; 
	LPADAPTER ipAdapter = (LPADAPTER) pInfo->ipAdapter;  
     
	if(PacketSetHwFilter(ipAdapter,NDIS_PACKET_TYPE_PROMISCUOUS)==FALSE) 
	{ 
		AfxMessageBox("Warning: unable to set promiscuous mode!"); 
	} 
	 
	// set a 512K buffer in the driver 
	if(PacketSetBuff(ipAdapter,512000)==FALSE){ 
		AfxMessageBox("Unable to set the kernel buffer!"); 
			return -1; 
	} 
 
	// set a 1 second read timeout 
	if(PacketSetReadTimeout(ipAdapter,1000)==FALSE) 
	{ 
		AfxMessageBox("Warning: unable to set the read tiemout!");	 
	} 
	//allocate and initialize a packet structure that will be used to 
	//receive the packets. 
	if((lpPacket = PacketAllocatePacket())==NULL) 
	{ 
		AfxMessageBox("Error: failed to allocate the LPPACKET structure.");	 
		return -1; 
	} 
	PacketInitPacket(lpPacket,(char*)buffer,256000); 
	 
		while(true) 
	{ 
	    // capture the packets 
		if(PacketReceivePacket(ipAdapter,lpPacket,TRUE)==FALSE) 
		{ 
			AfxMessageBox("Error: PacketReceivePacket failed"); 
			return -1; 
		} 
		else 
			PrintPackets(lpPacket);//////////////////////////////////////////////!!!!! 
		if(IsStop) 
		{AfxMessageBox("停止分析"); 
			return 0; 
		} 
	} 
 
	//print the capture statistics 
	if(PacketGetStats(ipAdapter,&stat)==FALSE){ 
		AfxMessageBox("Warning: unable to get stats from the kernel!"); 
	} 
	else 
		TRACE("\n\n%d packets received.\n%d Packets lost",stat.bs_recv,stat.bs_drop); 
 
	PacketFreePacket(lpPacket); 
	// close the adapter and exit 
	PacketCloseAdapter(ipAdapter); 
	TRACE("子线程停止"); 
 
	return 0; 
} 
 
UINT CBPOThread::StartSniff(LPVOID lParam) 
{ 
	CBPOParaClass::Sniff_INFO* pInfo = (CBPOParaClass::Sniff_INFO*)lParam; 
	CBPOThread* pThis=(CBPOThread*)(pInfo->pThread); 
	return pThis->Sniff(pInfo); 
} 
 
void CBPOThread::PrintPackets(LPPACKET lpPacket)  //显示捕获后的网络包。。 
{ 
	ULONG	i, j, ulLines, ulen, ulBytesReceived; 
	char	*pChar, *pLine, *base; 
	char	*buf; 
	u_int off=0; 
	u_int tlen,tlen1; 
	struct bpf_hdr *hdr; 
	CString str,strall; 
 
		ulBytesReceived = lpPacket->ulBytesReceived; 
		TRACE("接收到 %d bit\r\n",ulBytesReceived); 
 
		buf = (char*)lpPacket->Buffer;// 
		off=0; 
      
		while(offbh_hdrlen; 
//		TRACE("协议头长度: %d bit\r\n",HeadLen); 
		tlen1=hdr->bh_datalen; 
		tlen=hdr->bh_caplen;////////////////////长度。。。。。 
		TRACE("Packet length, captured portion: %ld, %ld\n", tlen1, tlen); 
		off+=hdr->bh_hdrlen; 
 
		ulLines = (tlen + 15) / 16; 
		TRACE("共 %d 行\r\n",ulLines); 
 
		pChar =(char*)(buf+off);//去掉hdr协议头 
 
//		pEditView1->SendMessage(WM_SHOWINFO,0,(LPARAM)(LPCTSTR)tmp);	 
		 
		base=pChar; 
		off=Packet_WORDALIGN(off+tlen); 
		 
		for ( i=0; i 16 ) ? 16 : ulen; 
			tlen -= ulen; 
 
			for ( j=0; jSendMessage(WM_SHOWINFO,0,(LPARAM)(LPCTSTR)strall); 
	}	 
} 
/////////////////////////////////////////////////////////////////////////////////// 
/////////////////////////////////////////////////////////////////////////////////// 
 
// EditView1.cpp : implementation file 
 
///////////////////////////////////////////////////////////////////////////// 
// CEditView1 
 
IMPLEMENT_DYNCREATE(CEditView1, CEditView) 
 
CEditView1::CEditView1() 
{ 
} 
 
CEditView1::~CEditView1() 
{ 
} 
 
 
BEGIN_MESSAGE_MAP(CEditView1, CEditView) 
	//{{AFX_MSG_MAP(CEditView1) 
	ON_WM_CHAR() 
	ON_CONTROL_REFLECT(EN_CHANGE, OnChange) 
	ON_WM_CREATE() 
	//}}AFX_MSG_MAP 
	ON_MESSAGE(WM_SHOWINFO,CEditView1::OnShowInfo) 
END_MESSAGE_MAP() 
 
 
int CEditView1::OnCreate(LPCREATESTRUCT lpCreateStruct)  
{ 
	if (CEditView::OnCreate(lpCreateStruct) == -1) 
		return -1; 
    pEditView1=this; 
	m_NewFont.CreatePointFont(100,"Arial",NULL); 
	GetEditCtrl().SetFont(&m_NewFont,true); 
	return 0; 
} 
 
void CEditView1::OnChange()  
{ 
	return; 
} 
 
 
 
void CEditView1::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)  
{ 
// 	CEditView::OnChar(nChar, nRepCnt, nFlags); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CEditView1 drawing 
 
void CEditView1::OnDraw(CDC* pDC) 
{ 
	CDocument* pDoc = GetDocument(); 
	// TODO: add draw code here 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CEditView1 diagnostics 
 
#ifdef _DEBUG 
void CEditView1::AssertValid() const 
{ 
	CEditView::AssertValid(); 
} 
 
void CEditView1::Dump(CDumpContext& dc) const 
{ 
	CEditView::Dump(dc); 
} 
#endif //_DEBUG 
 
LRESULT CEditView1::OnShowInfo(WPARAM wParam,LPARAM lParam) 
{ 
	CEdit& edit=GetEditCtrl(); 
	CString str=(LPCTSTR)lParam; 
	int nLine=edit.GetLineCount(); 
	int nStart=edit.LineIndex(nLine); 
	edit.SetSel(nStart,str.GetLength()+nStart); 
	edit.ReplaceSel("\r\n"+str); 
	return 0L; 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CEditView1 message handlers 
//////////////////////////////////////////////////////////////////////////////// 
/////////////////////////////////////////////////////////////////////////////// 
 
// EditView2.cpp : implementation file 
// 
///////////////////////////////////////////////////////////////////////////// 
// CEditView2 
 
IMPLEMENT_DYNCREATE(CEditView2, CView) 
 
CEditView2::CEditView2() 
{ 
} 
 
CEditView2::~CEditView2() 
{ 
} 
 
 
BEGIN_MESSAGE_MAP(CEditView2, CView) 
	//{{AFX_MSG_MAP(CEditView2) 
		// NOTE - the ClassWizard will add and remove mapping macros here. 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CEditView2 drawing 
 
void CEditView2::OnDraw(CDC* pDC) 
{ 
	CDocument* pDoc = GetDocument(); 
	// TODO: add draw code here 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CEditView2 diagnostics 
 
#ifdef _DEBUG 
void CEditView2::AssertValid() const 
{ 
	CView::AssertValid(); 
} 
 
void CEditView2::Dump(CDumpContext& dc) const 
{ 
	CView::Dump(dc); 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CEditView2 message handlers 
 
void CEditView2::ShowMessage(CString str) 
{ 
	CWindowDC dc(this); 
} 
////////////////////////////////////////////////////////////////////////////////// 
//////////////////////////////////////////////////////////////////////////////////// 
 
// BPOParaClass.cpp: implementation of the CBPOParaClass class. 
// 
////////////////////////////////////////////////////////////////////// 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CBPOParaClass::CBPOParaClass() 
{ 
 
} 
 
CBPOParaClass::~CBPOParaClass() 
{ 
 
} 
 
//////////////////////////////////////////////////////////////////////////////////////// 
//////////////////////////////////////////////////////////////////////////////////////// 
/************************************************************************ 
HTTP socket - DTS Project by Tair Abdurman 
************************************************************************/ 
 
/************************************************************************ 
clicksocket.cpp 
************************************************************************/ 
 
//instance counter 
int CHTTPSocket::nInstanceCount=0; 
 
CHTTPSocket::CHTTPSocket() 
{ 
if (nInstanceCount==0) 
{ 
//***********win32 specific ********************************************** 
	// WSA versions 
	BYTE vCount=3; 
	int vInfo[3][3]={ 
		{1,0,0}, 
		{1,1,0}, 
		{2,0,0} 
	}; 
 
	WORD vMMVersion=0; 
	int nStartupStatus;  
	 
	wsaData.wVersion=0; 
 
//******* Dynamically detect winsock version, from newest to oldest 
	while(vCount>0) 
	{ 
	  vMMVersion=MAKEWORD(vInfo[vCount-1][0],vInfo[vCount-1][1]); 
 
      nStartupStatus=WSAStartup(vMMVersion,&wsaData); 
	  if (nStartupStatus==0) 
		  break; 
	  else 
		  vInfo[vCount-1][2]=0; 
	  WSACleanup(); 
	  vCount--; 
	} 
//***********win32 specific ********************************************** 
} 
 
sckHTTPSocket=0; 
sinHTTPSocket.sin_port=0; 
sinHTTPServer.sin_port=0; 
 
//leave with timewait 
m_bNoTimeWait=FALSE; 
// recieve timeout to default value 
m_nRecvTimeout=HTTPRTIMEOUTDEF; 
// send timeout to default value 
m_nSendTimeout=HTTPSTIMEOUTDEF; 
// remote server host address, max size 64 bytes, 65th set to \0 
szcopy(m_szServerHost,"",MAXHOSTLENGTH-1); 
// remote server IP address, max size 15 bytes, 16th set to \0 
szcopy(m_szServerHostIP,"",MAXIPLENGTH); 
// remote server port 
m_nServerPort=80; 
// use proxy flag 
m_bUseProxy=FALSE; 
// error code 
m_nErrCode=ERR_OK; 
// extended error code; 
m_nExtErrCode=ERROR_SUCCESS; 
 
m_ulResponseSize=0; 
m_szResponse=NULL; 
 
 
InitInstance(); 
nInstanceCount++; 
}; 
 
CHTTPSocket::~CHTTPSocket() 
{ 
nInstanceCount--; 
if (nInstanceCount==0) 
{ 
//***********win32 specific ********************************************** 
	WSACleanup(); 
//***********win32 specific ********************************************** 
} 
}; 
 
void CHTTPSocket::ThrowError(int err, int xerr, const char* errdesc) //错误信息处理。。 
{ 
	      char ErrorInfo[100]; 
		  m_nErrCode=err; 
		  m_nExtErrCode=xerr; 
		  wsprintf(m_nErrInfo,errdesc); 
		  TRACE3("ErrCode = %d, ExtErrCode = %d, Info = %s\n",err,xerr,m_nErrInfo); 
          wsprintf(ErrorInfo,"ErrCode = %d, ExtErrCode = %d, Info = %s\n",err,xerr,m_nErrInfo); 
		  pEditView1->SendMessage(WM_SHOWINFO,0,(LPARAM)(LPCTSTR)("\r\n***************************出错信息****************************\r\n")); 
		  pEditView1->SendMessage(WM_SHOWINFO,0,(LPARAM)(LPCTSTR)ErrorInfo); 
		  OnError(); 
 }; 
 
BOOL CHTTPSocket::InitInstance() 
{ 
	return TRUE; 
}; 
////////////////////////////////////////////////////////////////////////// 
//sprintf like 
void CHTTPSocket::szcopy(char* dest,const char* src,int nMaxBytes) 
{ 
	int i_cntr=0; 
	while ((src[i_cntr]!='\0') || (i_cntrSendMessage(WM_RETURN,0,(LPARAM)(LPCTSTR)("REALGOOD")); 
	   pEditView1->SendMessage(WM_SHOWINFO,0,(LPARAM)(LPCTSTR)("\r\n**************************网站回复信息********************************\r\n")); 
	   pEditView1->SendMessage(WM_SHOWINFO,0,(LPARAM)(LPCTSTR)m_szResponse); 
       memPostup(); 
   }; 
 
//release allocated memory 
void CHTTPSocket::memPostup() 
{ 
	   if ((m_ulResponseSize!=0) && (m_szResponse!=NULL)) 
	   { 
           VirtualFree(m_szResponse,m_ulResponseSize,MEM_RELEASE); 
		   m_ulResponseSize=0; 
		   m_szResponse=NULL; 
	   } 
 
} 
//////////////////////////////////////////////////////////////////////////////// 
//perform request 
   void CHTTPSocket::Request(const char* url,const char* plmm)  //传送网址和参数。。 
   { 
 
			 
	CString szShowInfo; 
	szShowInfo="**********************传送中*************************"; 
	pEditView1->SendMessage(WM_SHOWINFO,0,(LPARAM)(LPCTSTR)szShowInfo); 
 
	   m_szResponse=NULL; 
	   m_ulResponseSize=0; 
 
       
	   if (url==NULL) 
	   { 
          ThrowError(ERR_URLNOTHING 
			         ,0 
					 ,"Error, url is nothing."); 
          return; 
	   } 
	   else 
	   { 
	   	   if (strlen(url)==0) 
		   { 
             ThrowError(ERR_URLNOTHING 
			            ,0 
				  	    ,"Error, 没输入网址,请重新输入."); 
             return; 
		   } 
 
	   } 
 
	   if (strlen(url)>MAXURLLENGTH) 
	   { 
          ThrowError(ERR_URLTOOLONG 
			         ,0 
					 ,"Error, 网址太长,请重新输入."); 
          return; 
	   } 
 
	   //************* check host - port - URI **************** 
	   char tmpSrc[MAXURLLENGTH+1]; 
	   char Plmm[MAXPLMMLEN+1]; 
	   int iURLSize=0,iPLMMSize=0; 
	   int iDefPos=0; 
	   int iHelpVar=0; 
	   int isPort=TRUE; 
 
//local copy of URL 
	   while (url[iURLSize]!='\0') 
	   { 
           tmpSrc[iURLSize]=url[iURLSize]; 
           iURLSize++; 
	   } 
	   tmpSrc[iURLSize]='\0'; 
       iURLSize++; 
 
//local copy of plmm  注:plmm为参数:) 
	   while (plmm[iPLMMSize]!='\0') 
	   { 
           Plmm[iPLMMSize]=plmm[iPLMMSize]; //注意大小写。。 
           iPLMMSize++; 
	   } 
	   Plmm[iPLMMSize]='\0'; 
       iPLMMSize++; 
	   szShowInfo="缓存网址:"+CString(tmpSrc); 
	   pEditView1->SendMessage(WM_SHOWINFO,0,(LPARAM)(LPCTSTR)szShowInfo); 
	   szShowInfo="参数:"+CString(Plmm); 
	   pEditView1->SendMessage(WM_SHOWINFO,0,(LPARAM)(LPCTSTR)szShowInfo); 
	   TRACE("\r\nCached URL: %s\r\n",tmpSrc); 
 
	   char* pProto=NULL; 
	   char* pHost=NULL; 
	   char* pPort=NULL; 
	   int nPort=-1; 
	   char* pURI=NULL; 
	   char* pParams=NULL; 
 
	   //search for "://" 
	   iHelpVar=0; 
	   iDefPos=0; 
	   while ((iHelpVar65535) || (pPort[0]=='\0')) 
		  { 
		            ThrowError(ERR_BADPORT 
		                       ,0 
		                       ,"端口号书写错误!"); 
                    return; 
		  } 
	   } 
 
	if (!m_bUseProxy)   /////没使用代理。。。。。 
	{ 
           m_szURL[0]='/'; 
           m_szURL[1]='\0'; 
//	   szShowInfo="没使用代理"; 
//	   pEditView1->SendMessage(WM_SHOWINFO,0,(LPARAM)(LPCTSTR)szShowInfo); 
		   TRACE0("没使用代理"); 
		   if (pURI!=NULL) //pURI在此代隐含的网址:/xxx/xxx.asp 
		   { 
		     if (pURI[0]!='\0') 
			   szcopy(&m_szURL[1],pURI,strlen(pURI)); 
		   } 
	} 
	else 
	{ 
		if (m_szServerHost==NULL) 
		{ 
            ThrowError(ERR_PROXYUNKNOWN 
				       ,0 
					   ,"错误, proxy not specified."); 
			return; 
		} 
		else 
		{ 
			if (m_szServerHost[0]=='\0') 
			{ 
               ThrowError(ERR_PROXYUNKNOWN 
 				         ,0 
					     ,"错误, proxy not specified."); 
			   return; 
			} 
		} 
 
	} 
       szShowInfo="\r\n"; 
	   pEditView1->SendMessage(WM_SHOWINFO,0,(LPARAM)(LPCTSTR)szShowInfo); 
	   TRACE("\r\n"); 
 
	   //szShowInfo="Proto: "+CString(pProto)+"\r\n"; 
	   //pEditView1->SendMessage(WM_SHOWINFO,0,(LPARAM)(LPCTSTR)szShowInfo); 
	   TRACE("Proto: %s\r\n",pProto); 
	   TRACE("Host: %s\r\n",pHost); 
	   TRACE("Port: %s ==> %d\r\n",pPort,nPort); 
	   TRACE("URI: %s\r\n",pURI); 
 
   if (m_bUseProxy) 
   { 
      
	 wsprintf(m_szHost,"%s",pHost); 
	 if (pProto==NULL) 
	 { 
	   wsprintf(m_szURL,"http://%s",url); 
	 } 
	 else 
	 { 
		 if (pProto[0]=='\0') 
		 { 
	       wsprintf(m_szURL,"http://%s",url); 
		 } 
		 else 
	       wsprintf(m_szURL,"%s",url); 
	 } 
 
   } 
   else 
   { 
     wsprintf(m_szServerHost,"%s",pHost); 
     wsprintf(m_szServerHostIP,"%s",pHost); 
     wsprintf(m_szHost,"%s",pHost); 
	 wsprintf(m_szURL,"%s",m_szURL); 
	 m_nServerPort=nPort; 
   } 
//************* check host - port - URI **************** 
 
  TRACE("Server: %s ServerIP: %s Port: %d \r\n",m_szServerHost,m_szServerHostIP,m_nServerPort); 
  TRACE("Proxy:"); 
  if (m_bUseProxy) 
     TRACE(" YES\r\n"); 
  else 
     TRACE(" NO\r\n"); 
  TRACE("URL/URI: %s HOST: %s\r\n",m_szURL,m_szHost); 
 
  sckHTTPSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
        
	   if (sckHTTPSocket==INVALID_SOCKET) 
	   { 
	      ThrowError(ERR_WSAINTERNAL 
		             ,sckHTTPSocket 
		             ,"Error when socket."); 
          return; 
	   } 
 
	   //off TIME_WAIT 
	   struct linger zeroLinger;	 
	   zeroLinger.l_onoff = 1;	 
	   zeroLinger.l_linger = 0; 
	   if(setsockopt(sckHTTPSocket 
	                 ,SOL_SOCKET 
			         ,SO_LINGER 
			         ,(const char *)&zeroLinger 
			         ,sizeof(zeroLinger))!=0) 
	   { 
	      closesocket(sckHTTPSocket); 
	      ThrowError(ERR_WSAINTERNAL 
		             ,WSAGetLastError() 
		             ,"Error when setsockopt(LINGER)."); 
		  OnError(); 
          return; 
	   } 
 
	   //set recieve timeout 
	   if(setsockopt(sckHTTPSocket 
	                 ,SOL_SOCKET 
			         ,SO_RCVTIMEO 
			         ,(const char *)&m_nRecvTimeout 
			         ,sizeof(m_nRecvTimeout))!=0) 
	   { 
	      closesocket(sckHTTPSocket); 
	      ThrowError(ERR_WSAINTERNAL 
		             ,WSAGetLastError() 
		             ,"Error when setsockopt(RCVTIME)."); 
          return; 
	   } 
 
	   //set send timeout 
	   if(setsockopt(sckHTTPSocket 
	          ,SOL_SOCKET 
			  ,SO_SNDTIMEO 
			  ,(const char *)&m_nSendTimeout 
			  ,sizeof(m_nSendTimeout))!=0) 
	   { 
	      closesocket(sckHTTPSocket); 
	      ThrowError(ERR_WSAINTERNAL 
		            ,WSAGetLastError() 
		            ,"Error when setsockopt(SNDTIMEO)."); 
          return; 
	   } 
 
       //local settings 
	   sinHTTPSocket.sin_addr.s_addr = htonl (INADDR_ANY); 
       sinHTTPSocket.sin_family=AF_INET; 
 
       //bind socket 
	   if (bind (sckHTTPSocket,                           
                 (const struct sockaddr FAR *)&sinHTTPSocket,   
                 sizeof(sinHTTPSocket))==SOCKET_ERROR) 
	   { 
	      closesocket(sckHTTPSocket); 
	      ThrowError(ERR_WSAINTERNAL 
		             ,WSAGetLastError() 
		             ,"Error when bind socket."); 
          return; 
	   } 
 
       //set HTTP Server's info 
	   int tmpErr=0; 
	   unsigned long tmpIAddr=0; 
	   //try find by name 
	   struct hostent FAR * heServHostInfo=NULL; 
	   heServHostInfo=gethostbyname((const char FAR *)m_szServerHost); 
	   if ((heServHostInfo==NULL) || (strlen(m_szServerHost)==0)) 
	   { 
		   tmpErr=WSAGetLastError(); 
		   //try find by ip 
		   tmpIAddr=inet_addr(m_szServerHostIP); 
		   if ((tmpIAddr==INADDR_NONE) || (strlen(m_szServerHostIP)==0)) 
		   { 
	           closesocket(sckHTTPSocket); 
	           ThrowError(ERR_BADHOST 
			             ,tmpErr 
		                 ,"Error when resolve host."); 
               return; 
		   } 
		   else 
			//found by ip 
			sinHTTPServer.sin_addr.S_un.S_addr=tmpIAddr; 
 
	   } 
	   else 
         //found by name 
       sinHTTPServer.sin_addr.S_un.S_addr=*( 
		                              (long *)(heServHostInfo->h_addr)); 
 
       sinHTTPServer.sin_family=AF_INET; 
	   sinHTTPServer.sin_port=htons(m_nServerPort); 
 
	   //allow status check when connect performed 
	   struct fd_set fdSet; 
       struct timeval tmvTimeout={0L,0L};//select函数返回时间。。 
   
       FD_ZERO(&fdSet);//置空。。 
       FD_SET(sckHTTPSocket, &fdSet); //把句柄sckHTTPSocket添加到队列fdset中。。 
   
       if (select(0,&fdSet,NULL,NULL,&tmvTimeout)==SOCKET_ERROR) 
	   { 
	      closesocket(sckHTTPSocket); 
          ThrowError(ERR_WSAINTERNAL 
		             ,WSAGetLastError() 
		             ,"Error when select."); 
          return; 
	   }; 
       //try to connect 
       if (connect(sckHTTPSocket 
		           ,(const struct sockaddr FAR *)&sinHTTPServer 
				   ,sizeof(sinHTTPServer))==SOCKET_ERROR) 
	   { 
	      closesocket(sckHTTPSocket); 
          ThrowError(ERR_WSAINTERNAL 
		             ,WSAGetLastError() 
		             ,"Error when connect."); 
          return; 
	   } 
 
        
       //send page request 
//*********************************************************************** 
 
  CString str; 
  str="POST "+CString(m_szURL)+" HTTP/1.1\r\n"; 
  str+= "Accept: image/gif, image/x-bitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, application/x-comet, */*\r\n"; 
// szsent(sckHTTPSocket,"Referer: http://");   ///////////发送Referer头。。。。。 
  str+= "Referer: http://"+CString(pHost)+CString(m_szURL)+"\r\n"; 
  str+= "Accept-Language: zh-cn\r\n";  
  str+="Content-Type: application/x-www-form-urlencoded\r\n"; 
  str+="Accept-Encoding: gzip, deflate\r\n"; 
  str+="Cache-Control: no-cache\r\n"; 
  CString plmm2; 
  plmm2=URLEncode(CString(Plmm)); //必须在求length前面。。。不然求出后的length不正确。。 
   char length[100]; 
   wsprintf(length,"%d",strlen(plmm2));//由于时间比较紧迫我没有想到更好的转化函数 
   str+="Content-Length: "; 
   str+=CString(length); 
   str+="\r\n";      
  str+="Connection: Keep-Alive\r\n"; 
  str+="User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; RealGood; RG Agent;)\r\n"; 
  str+="Host: "+CString(pHost)+"\r\n"+"\r\n"; 
/////////////////////////////数据发送。。。。。。。 
  str+=plmm2; 
  pEditView1->SendMessage(WM_SHOWINFO,0,(LPARAM)(LPCTSTR)("\r\n*********************发送头信息*********************\r\n")); 
  pEditView1->SendMessage(WM_SHOWINFO,0,(LPARAM)(LPCTSTR)str); 
  szsent(sckHTTPSocket,str); 
 
//***********************************************************************  
 
 
	   //recieve 
	   char tmpBuffer[MAXBLOCKSIZE]; 
	   char FAR* defMem; 
	   char FAR* prevMem; 
	   defMem=prevMem=NULL; 
	   ULONG totalSize=0; 
	   ULONG estimatedSize=0,tmpVar=0; 
	   int  curSize=1; 
	try 
	{ 
	   while((curSize!=SOCKET_ERROR) && (curSize!=0)) 
	   { 
	        curSize=recv(sckHTTPSocket 
                        ,(char FAR *)tmpBuffer 
                        ,(MAXBLOCKSIZE-1) 
				        ,0); 
	    
		  estimatedSize=totalSize+curSize; 
	    
		  defMem=(char FAR*)VirtualAlloc(NULL,estimatedSize,MEM_COMMIT,PAGE_READWRITE); 
	    
 
          estimatedSize=0; 
		  if (prevMem!=NULL) 
		  { 
			   while(estimatedSizeGetNextLine(szBuffer,m_nBufferSize); 
	if(dwReturn != 0) 
		szLine = szBuffer; 
	else szLine = "";	//Empty 
	delete szBuffer; 
	return dwReturn; 
} 
 
// =======================Function Description======================= 
//  
// FUNCTION	:  CStringFile::GetNextLine() 
//  
// Description	: Read the next line from a file 
// Returns	: [DWORD] - 0 nothing read because of an error or EOF 
//						non 0...index of line first line has line  
//						number 1 
// Params	:  
//			  [LPSTR szLine] - Pointer to a buffer which recieves the  
//								read line 
//			  [int iLineSize] - Size of the supplied line buffer 
// ================================================================== 
DWORD CStringFile::GetNextLine(LPSTR szLine, int iLineSize)  //获取文本文档行。。 
{ 
	BYTE	*chTemp; 
	BOOL	bStop=FALSE; 
	int		nOut; 
 
	chTemp = (LPBYTE) szLine; 
	*chTemp = 0; 
	nOut = 0; 
	while(!bStop) 
	{ 
		if(!m_dwLine || m_dwIndex==m_dwRead) 
		{ 
			m_dwMasterIndex = m_fFile.Seek(0,CFile::current); 
			m_dwRead=m_fFile.Read((LPVOID) m_pBuffer,m_nBufferSize); 
			m_dwIndex = 0; 
			if(m_dwRead == 0) 
			{ 
				bStop = TRUE; //Error during readfile or END-OF-FILE encountered 
				if(nOut>0) 
				{ 
					chTemp[nOut++] = (char) 0; 
					return m_dwLine;	 
				} 
				else return m_dwLine = 0; //nix gelezen 
			} 
			else 
			{ 
				if(m_dwRead != (DWORD) m_nBufferSize) 
					bStop = TRUE;	//END-OF-FILE 
			} 
		} 
		for(;m_dwIndex < m_dwRead;m_dwIndex++) 
		{ 
			if((nOut+1) == iLineSize) 
			{ 
				m_szError.Format("m_pBuffer overflow in line %u (line length over %d chars)",++m_dwLine,iLineSize); 
				::MessageBox(NULL,m_szError,"Warning !",MB_ICONEXCLAMATION|MB_OK); 
				chTemp[nOut] = '\0'; 
				return m_dwLine; 
			} 
			switch(m_pBuffer[m_dwIndex]) 
			{ 
			case 0x0d://End of Line encountered 
			case 0x0a: 
				if((m_dwIndex+1) < m_dwRead) // Check we're not on end of m_pBuffer ??? 
					if(m_pBuffer[m_dwIndex+1] == '\n' || m_pBuffer[m_dwIndex+1] == '\r') 
					{ 
						if(!*chTemp) 
							m_dwLine++; 
						m_dwIndex++; 
					} 
				if(*chTemp) 
				{ 
					chTemp[nOut++] = '\0'; 
					m_dwLine++; 
					return m_dwLine; 
				} 
				break; 
			default: chTemp[nOut++] = m_pBuffer[m_dwIndex]; 
			} 
		} 
	} 
	if(nOut>0) 
	{ 
		chTemp[nOut++] = '\0'; 
		return m_dwLine;	 
	} 
	return m_dwLine = 0; //nix gelezen 
} 
 
void CStringFile::GetErrorText(CString &szMsg) 
{ 
	szMsg = m_szError; 
} 
 
// =======================Function Description======================= 
//  
// FUNCTION	:  CStringFile::Reset() 
//  
// Description:Reset the linecounter....this function effectively sets 
//			the reading pointer to 0, so when the GetNextLine is  
//			executed it will start reading the first line 
// ------------------------------------------------------------------ 
// Returns	: [void] - none 
//  
// Params	: - none - 
//  
// ================================================================== 
void CStringFile::Reset() //返回到文件头。。。。 
{ 
	m_dwIndex = 0; 
	m_dwLine = 0; 
	m_fFile.SeekToBegin(); 
} 
 
//////////////////////////////////////////////////////////////////////////////////// 
////////////////////////////////////////////////////////////////////////////////////// 
 
// MpoDlg.cpp : implementation file 
 
///////////////////////////////////////////////////////////////////////////// 
// CMpoDlg dialog 
 
 
CMpoDlg::CMpoDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CMpoDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CMpoDlg) 
	m_cont = _T(""); 
	m_email = _T(""); 
	m_pass = _T(""); 
	m_subj = _T(""); 
	m_tele = _T(""); 
	m_url = _T(""); 
	m_user = _T(""); 
	m_mean = _T(""); 
	//}}AFX_DATA_INIT 
} 
 
 
void CMpoDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CMpoDlg) 
	DDX_Text(pDX, IDC_CONT, m_cont); 
	DDX_Text(pDX, IDC_EMAIL, m_email); 
	DDX_Text(pDX, IDC_PASS, m_pass); 
	DDX_Text(pDX, IDC_SUBJ, m_subj); 
	DDX_Text(pDX, IDC_TELE, m_tele); 
	DDX_Text(pDX, IDC_URL, m_url); 
	DDX_Text(pDX, IDC_USER, m_user); 
	DDX_Text(pDX, IDC_MEAN, m_mean); 
	//}}AFX_DATA_MAP 
} 
 
 
BEGIN_MESSAGE_MAP(CMpoDlg, CDialog) 
	//{{AFX_MSG_MAP(CMpoDlg) 
	ON_BN_CLICKED(ID_MPO, OnMpo) 
	ON_BN_CLICKED(IDC_BUTTON4, OnEmpty) 
	ON_BN_CLICKED(IDC_BUTTON1, OnHMA) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CMpoDlg message handlers 
 
void CMpoDlg::OnMpo() //多线程信息群发入口 
{ 
	iCounter=-2;  ///全局变量初始化。。。。 
	UpdateData(true);////////////////填入信息。。 
	CBPOParaClass::MPO_INFO* mInfo = new (CBPOParaClass::MPO_INFO); 
    mInfo->m_msg.user =m_user; 
	mInfo->m_msg.pass =m_pass; 
	mInfo->m_msg.email=m_email; 
	mInfo->m_msg.url  =m_url; 
	mInfo->m_msg.tele =m_tele; 
	mInfo->m_msg.mean =m_mean; 
	mInfo->m_msg.subj =m_subj; 
	mInfo->m_msg.cont =m_cont; 
	CStringFile cf; 
 
	///获得路径。。。TXT文本与本程序放在同一路径下并且同名。。 
	CFileException fe;  
	CString str,path,szLine; 
	mInfo->urllist.SetSize(0); 
 
	path=AfxGetApp()->m_pszHelpFilePath; 
	str=AfxGetApp()->m_pszExeName; 
	path=path.Left(path.GetLength()-str.GetLength()-4); 
	BOOL bExist=cf.Open(path+str+".txt",&fe); 
	if(!bExist) 
	{ 
	AfxMessageBox("缺少"+path+str+".txt,请检查!"); 
	return; 
	} 
	int i=0; 
	while(cf.GetNextLine(szLine))  //按顺序获取行 
	{ 
	mInfo->urllist.Add(szLine); 
	TRACE("BADBOY %s\r\n",mInfo->urllist[i]); 
	i++; 
	} 
	int j = mInfo->urllist.GetSize(); 
	TRACE("网址数组大小:%d\r\n",j); 
	  
		////////////////////////////////////////多线程开始。。。 
	 CBPOThread* mThread=new CBPOThread("GOOD"); 
	 mInfo->pThread = mThread; 
	 CWinThread* PosMT[10]; 
	 HANDLE		 hThread[10]; 
	 HANDLE		 hCounter=NULL; 
	 int k =0; 
 
	 	if( (hCounter=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"sam sp 44"))==NULL) 
	{ 
		//如果没有其他进程创建这个互斥量,则重新创建 
		hCounter = CreateMutex(NULL,FALSE,"sam sp 44"); 
	} 
	/////在此下应采用类似网络蚂蚁多线程方法!但现在仅以简单算法代替//////////// 
     int v,j1; 
	 j1=j/2; 
     if(j1=1) 
	 v=1; 
	 else{ 
	 v=(j1)/10; 
	 if((j1%10)>0) 
		v++; 
	 } 
	 for(int i1=0;i1StartMPO,mInfo,THREAD_PRIORITY_NORMAL, 
		0,CREATE_SUSPENDED,NULL)) 
		{ 
		nThreadCount++; 
		PosMT[k]->ResumeThread(); 
		} 
	 Sleep(150); 
	 hThread[k]=PosMT[k]->m_hThread; 
	 k++;	  
	 } 
	 //等待线程结束; 
//	WaitForMultipleObjects(k,hThread,TRUE,INFINITE);  //如果用这个函数的话,程序一进入线程就动不了了!WHY? 
	 }  //for end! 
	CloseHandle(hCounter); 
	Sleep(1000); 
	TRACE("Pro Ended!"); 
	delete mInfo; 
	delete mThread;	 
	 
} 
 
void CMainFrame::OnMpo() //打开群发对话框。。 
{ 
	CMpoDlg cmd; 
	cmd.DoModal(); 
	 
} 
 
void CMpoDlg::OnCancel()  
{ 
	// TODO: Add extra cleanup here 
	 
	CDialog::OnCancel(); 
} 
 
void CMpoDlg::OnEmpty() //清空栏信息。。。 
{ 
	m_user.Empty(); 
	m_pass.Empty(); 
	m_email.Empty(); 
	m_url.Empty(); 
	m_tele.Empty(); 
 
	m_mean.Empty(); 
	m_subj.Empty(); 
	m_cont.Empty(); 
	UpdateData(false);	 
} 
 
void CMpoDlg::OnHMA() //填入栏信息。。。 
{ 
	m_user="Davens"; 
	m_pass ="******"; 
	m_email ="master@ywetrade.com"; 
	m_url ="http://www.ywetrade.com"; 
	m_tele ="086 595 5282123"; 
 
	m_mean ="佳实拉链热封胶带"; 
	m_subj ="佳实热封胶带有限公司"; 
	m_cont ="供应拉链胶带"; 
	UpdateData(false); 
} 
 
void CMainFrame::OnStop() //停止捕获信息。。(与菜单关联) 
{ 
	IsStop = 1	; 
} 
 
BYTE CHTTPSocket::toHex(const BYTE &x) //由URLEncode调用。 
{ 
	return x > 9 ? x + 55: x + 48; 
} 
 
CString CHTTPSocket::URLEncode(CString sIn)   //对汉字进行URL编码 
{ 
	CString sOut; 
       const int nLen = sIn.GetLength() + 1; 
       register LPBYTE pOutTmp = NULL; 
       LPBYTE pOutBuf = NULL; 
       register LPBYTE pInTmp = NULL; 
       LPBYTE pInBuf =(LPBYTE)sIn.GetBuffer(nLen); 
       BYTE b = 0; 
       //alloc out buffer 
       pOutBuf = (LPBYTE)sOut.GetBuffer(nLen*3 -2);//new BYTE [nLen  * 3 - 2]; 这儿有问题!须改正。。 
       if(pOutBuf) 
       { 
              pInTmp  = pInBuf; 
              pOutTmp = pOutBuf; 
              // do encoding 
              while (*pInTmp) 
              { 
               	  if(('='==*pInTmp)||(isalnum(*pInTmp))||('&'==*pInTmp))//不编码'='和'&' 
                            *pOutTmp++ = *pInTmp; 
                     else 
                            if(isspace(*pInTmp)) 
                                   *pOutTmp++ = '+'; 
                            else 
                            { 
								*pOutTmp++ = '%';  // 加入'%' 
								   *pOutTmp++ = toHex(*pInTmp>>4); 
								   *pOutTmp++ = toHex(*pInTmp%16); 
							} 
							pInTmp++; 
			  } 
			 // *pOutTmp = ' '; 
			  //sOut=pOutBuf; 
			  //delete [] pOutBuf; 
			  sOut.ReleaseBuffer(); 
	   } 
	   sIn.ReleaseBuffer(); 
	   return sOut; 
} 
///////////////////////////////////////////////////////////////////////////////////// 
////////////////////////////////////////////////////////////////////////////////////// 
 
 
// BPONView.cpp : implementation of the CBPONView class 
 
///////////////////////////////////////////////////////////////////////////// 
// CBPONView 
 
IMPLEMENT_DYNCREATE(CBPONView, CListView) 
 
BEGIN_MESSAGE_MAP(CBPONView, CListView) 
	//{{AFX_MSG_MAP(CBPONView) 
	ON_COMMAND(ID_STATE, OnState) 
	//}}AFX_MSG_MAP 
	// Standard printing commands 
	ON_COMMAND(ID_FILE_PRINT, CListView::OnFilePrint) 
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CListView::OnFilePrint) 
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CListView::OnFilePrintPreview) 
	ON_MESSAGE(WM_RETURN,CBPONView::OnReturn) 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CBPONView construction/destruction 
 
CBPONView::CBPONView() 
{ 
 
} 
 
CBPONView::~CBPONView() 
{ 
} 
 
BOOL CBPONView::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	// TODO: Modify the Window class or styles here by modifying 
	//  the CREATESTRUCT cs 
    pBPOView=this;               //////得到窗口句柄。。。h_Wnd  在sendMessage中用到! 
	return CListView::PreCreateWindow(cs); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CBPONView drawing 
 
void CBPONView::OnDraw(CDC* pDC) 
{ 
	CBPONDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	// TODO: add draw code for native data here 
} 
 
void CBPONView::OnInitialUpdate() 
{ 
	CListView::OnInitialUpdate(); 
	ListView_SetExtendedListViewStyle(GetListCtrl(), LVS_EX_FULLROWSELECT); 
	//当点击时这一行都变成选中状态 
	CListCtrl &m_listView = GetListCtrl(); 
	m_listView.ModifyStyle(NULL, LVS_REPORT); 
	//修改属性参数 
	LV_COLUMN lvColumn; //列表的结构类型 
	lvColumn.mask=LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|WS_CHILD|WS_BORDER|WS_GROUP|LVS_REPORT|LVS_EDITLABELS; 
	lvColumn.fmt=LVCFMT_CENTER; 
 
	lvColumn.cx=250; 
	lvColumn.iSubItem=0; 
	lvColumn.pszText="网站"; 
	m_listView.InsertColumn(0,&lvColumn); 
 
	lvColumn.iSubItem=1; 
	lvColumn.cx=75; 
	lvColumn.pszText="状态"; 
	m_listView.InsertColumn(1,&lvColumn); 
 
	lvColumn.iSubItem=2; 
	lvColumn.cx=75; 
	lvColumn.pszText="大小"; 
	m_listView.InsertColumn(2,&lvColumn); 
 
	lvColumn.cx=75; 
	lvColumn.iSubItem=3; 
	lvColumn.pszText="耗时"; 
	m_listView.InsertColumn(3,&lvColumn); 
 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CBPONView printing 
 
BOOL CBPONView::OnPreparePrinting(CPrintInfo* pInfo) 
{ 
	// default preparation 
	return DoPreparePrinting(pInfo); 
} 
 
void CBPONView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add extra initialization before printing 
} 
 
void CBPONView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add cleanup after printing 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CBPONView diagnostics 
 
#ifdef _DEBUG 
void CBPONView::AssertValid() const 
{ 
	CListView::AssertValid(); 
} 
 
void CBPONView::Dump(CDumpContext& dc) const 
{ 
	CListView::Dump(dc); 
} 
 
CBPONDoc* CBPONView::GetDocument() // non-debug version is inline 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CBPONDoc))); 
	return (CBPONDoc*)m_pDocument; 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CBPONView message handlers 
 
void CBPONView::SetLvItem() //设置CListCtrl表项 
{ 
		SPS Sps[]={//信息 
	{"http://www.ywetrade.com","1000","30","30000"}, 
	{"http://www.163.com","1000","29","29000"}, 
	{"http://www.google.com","1000","28","28000"}}; 
	CListCtrl &m_listView = GetListCtrl(); 
	//向列表控件中添加表项 
	int i,iPos,iItemNum; 
	iItemNum=sizeof(Sps)/sizeof(SPS); 
	TRACE("iItemNum: %d\r\n",iItemNum); 
	LV_ITEM lvI; 
	for(i=0;i