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