⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sendsms.cpp

📁 Send SMS useing Com,it is simple
💻 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 + -