📄 sendsms.cpp
字号:
// SendSMS.cpp: implementation of the CSendSMS class.
//
// 这个类完成短消息的群发任务,用了工作线程来提高效率,而且不影响主界面的
// 操作.
//
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "SendSMS.h"
// log file
//#include "Log.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
UINT pflag=0;
UINT SendMutliSms(LPVOID pParam)
{
DWORD s0 = GetTickCount();
ThreadData* pData = (ThreadData*)pParam;
CStringArray* pArray = pData->pArrayUser;
int pos = pData->iPos;
pData->ev[pos].SetEvent(); // release pData->iPos
CString szTmp =pData->szPreUrl;
int lengh = pArray->GetSize() -1;
int nThreadNum = (lengh / MAXNOOFTHREAD +1 ) < MAXTHREAD ?(lengh / MAXNOOFTHREAD+1):MAXTHREAD;
// int step = lengh/MAXTHREAD;
int step = lengh/nThreadNum;
int iStart = pos*step; //本次发送的第一个号码
int iTop = iStart + step;
if(iTop > lengh || (lengh - iTop > 0 && lengh - iTop < step ))
iTop = lengh;
// http
CInternetSession httpSess; //
CHttpConnection* pConn = NULL;
CHttpFile* pFile = NULL;
int start0 = 0;
// CLog file;
// file.OpenLog("thread.txt",2);
char ReBuf[255];
char* pdest = NULL;
try
{
CString strServerName;
CString strObject;
CString strTmpRs;
INTERNET_PORT nPort;
DWORD dwServiceType;
if (!AfxParseURL(szTmp, dwServiceType, strServerName, strObject, nPort) ||
dwServiceType != INTERNET_SERVICE_HTTP)
{
AfxThrowInternetException(1);
}
pConn = httpSess.GetHttpConnection(strServerName,nPort);
while(iStart < iTop)
{
CString url = strObject;
start0 = iStart;
for(int i=0;i<MAXNOOFTHREAD && iStart < iTop;i++)
{
strTmpRs = pArray->GetAt(iStart);
if(pflag<13020)
{
if(strTmpRs.Find("861",0) != 0)
url += "86";
}
url += strTmpRs; //pArray->GetAt(iStart);
url += _T("|");
iStart++;
}
url.Delete(url.GetLength()-1); // delte last "|"
url += _T("&text=");
url += pArray->GetAt(lengh);
CString temp= pArray->GetAt(lengh);
// file.WriteLog("url",url);
pFile = pConn->OpenRequest(CHttpConnection::HTTP_VERB_GET,url); //get
// Sleep(3000);
if(!pFile->SendRequest())
{ // send fails
if(pData->hMain != NULL)
PostMessage(pData->hMain,WM_SENDONCE,2,0);
continue;
}
DWORD dwRet;
pFile->QueryInfoStatusCode(dwRet);
if (dwRet == HTTP_STATUS_DENIED || dwRet >= 400)
{
if(pData->hMain != NULL)
PostMessage(pData->hMain,WM_SENDONCE,2,0); //report error
break;
}
pFile->Read(ReBuf,254);
ReBuf[strlen(ReBuf)] = '\0';
pdest = strrchr(ReBuf,':');
if( NULL == pdest)
{
int iWorng = 0;
if( ReBuf[0] == 'A' )
iWorng ++;
else if( ReBuf[0] == 'W')
iWorng += 2;
if(pData->hMain != NULL)
PostMessage(pData->hMain,WM_SENDONCE,2,iWorng); //report error
break;
}
// send a message to main interface
if(pData->hMain != NULL)
PostMessage(pData->hMain,WM_SENDONCE,1,iStart-start0); //成功发送 N 个号码
}
}
catch(CInternetException* pEx)
{
pEx->GetErrorMessage(ReBuf,255);
ReBuf[strlen(ReBuf)] = '\0';
pEx->Delete();
if(pData->hMain != NULL)
PostMessage(pData->hMain,WM_SENDONCE,3,iTop - start0); //report error
}
if(pConn != NULL)
delete pConn;
if(pFile != NULL)
pFile->Close();
httpSess.Close();
if(pData->hMain != NULL)
PostMessage(pData->hMain,WM_SENDONCE,4,GetTickCount()-s0); //send time elapsed
return 0;
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSendSMS::CSendSMS()
{
pData = NULL ;
m_szError = "";
}
CSendSMS::~CSendSMS()
{
if(pData)
delete pData;
}
void CSendSMS::SetProxy(CString szIP, UINT nPort)
{
pData->bProxy = TRUE;
pData->szAddrProxy = szIP;
pData->nPortProxy = nPort;
}
//设置发送时的参数
//
// 参数分两种,一种是发送时候url地址的参数,一种是与代理服务器的参数
//
BOOL CSendSMS::SetParam(CString strServername, UINT nPort, CString strUsername, CString strPassword,HWND hMain)
{
if(NULL == pData)
pData = new ThreadData;
if(NULL == pData)
{
m_szError = "new data which thread needed fails";
return FALSE;
}
pData->bProxy = FALSE;
CString ip = strServername;
pData->szPreUrl.Format("HTTP://%s:%d/cgi-bin/sendsms?username=%s&password=%s&pid=0&dcs=65536&sendtype=2&to=",/* 15 */
strServername,nPort,strUsername,strPassword);
pData->hMain = hMain;
pflag=nPort;
return TRUE;
}
//开始发送,使用多线程,在这里进行线程的调度
BOOL CSendSMS::StartSend(CStringArray* pszReceiver)
{
pData->pArrayUser = pszReceiver;
int size = pszReceiver->GetSize()-1;
int nThreadNum = 0;
if( size < 1)
return FALSE;
CWinThread* pThread = NULL;
nThreadNum = (size/MAXNOOFTHREAD+1) < MAXTHREAD ? (size/MAXNOOFTHREAD+1):MAXTHREAD;
for(int i = 0; i< nThreadNum && i < size; i++)
{
if(!pData->ev[i].ResetEvent())
{
m_szError.Format("event %d set nonsignaled fails",i);
if(pData->hMain != NULL)
::PostMessage(pData->hMain,WM_SENDONCE,0,0);
}
pThread =NULL;
pData->iPos = i;
pThread = AfxBeginThread(SendMutliSms,(LPVOID)pData,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);
if(NULL == pThread)
{
m_szError.Format("create thread fails");
if(pData->hMain != NULL)
::PostMessage(pData->hMain,WM_SENDONCE,0,0);
return FALSE;
}
//start run
pThread->ResumeThread();
// waiting for work thread until get value of posThread,iPos
if(::WaitForSingleObject(pData->ev[i],INFINITE) != WAIT_OBJECT_0)
{
m_szError.Format("Wait for event fails");
if(pData->hMain != NULL)
::PostMessage(pData->hMain,WM_SENDONCE,0,0);
}
}
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
/* CHttpSocket
CHttpSocket::CHttpSocket()
{
}
CHttpSocket::~CHttpSocket()
{
}
// Do not edit the following lines, which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(CHttpSocket, CAsyncSocket)
//{{AFX_MSG_MAP(CHttpSocket)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif // 0
/////////////////////////////////////////////////////////////////////////////
// CHttpSocket member functions
BOOL CHttpSocket::ConnectHttp(CString szServername, UINT nPort)
{
if(!Create())
return FALSE;
if(!Connect(szServername,nPort))
{
if(GetLastError() == WSAEWOULDBLOCK)
{
;
}
else
{
return FALSE;
}
}
return TRUE;
}
void CHttpSocket::OnSend(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
CAsyncSocket::OnSend(nErrorCode);
}
void CHttpSocket::OnClose(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
CAsyncSocket::OnClose(nErrorCode);
}
void CHttpSocket::OnConnect(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
CAsyncSocket::OnConnect(nErrorCode);
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -