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

📄 sendsms.cpp

📁 通过编程
💻 CPP
字号:
/*
* Copyright (c) 2003,Rainsoft Studio
* All rights reserved.
*
* 文件名称:SendSMS.cpp
* 文件标识:见配置管理计划书
* 摘要:发送短信的出口主文件
*
* 当前版本:1.0
* 作者:王正平
* 完成日期:2003年07月03日
*/

#include <windows.h>
#include "SendSMS.h"
#include <wininet.h>
#include <TChar.h>
#include <stdio.h>
// 回车换行字符串
const char CLRF[2] = {0x0D, 0x0A};
// 预定义网关
typedef struct _GateWay
{
  char Name[16];
  char Comment[30];
  char Count[2];
} GateWay, *PGateWay;

GateWay GateWayList[20];
     
/*****************************************************************
* 函数介绍: Dll文件的主入口函数
* 输入参数:
* 输出参数:
* 返 回 值:
*****************************************************************/
BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
	switch (ul_reason_for_call)
	{
		case DLL_PROCESS_ATTACH:
			break;
		case DLL_THREAD_ATTACH:
			break;
		case DLL_THREAD_DETACH:
			break;
        case DLL_PROCESS_DETACH:
			break;
    }
    return true;
}

/*****************************************************************
* 函数介绍: 执行HTTP的Post或Get方法
* 输入参数: TCHAR* hdrs       - HTTP头
            TCHAR* accept     - Accept类型
			TCHAR* Method     - POST 或 GET
			TCHAR* frmdata    - 要提交的数据
			TCHAR* ServerName - 服务器地址
			TCHAR* FormAction - 数据提交到的网页名称
* 输出参数: 无
* 返 回 值: int               - 返回操作状态(见SendSMS)
*****************************************************************/
int doHTTP(TCHAR* hdrs, TCHAR* accept, TCHAR* Method, TCHAR* frmdata, TCHAR* ServerName, TCHAR* FormAction)
{
   // 创建Internet
   HINTERNET hSession = InternetOpen("MyAgent", 
	                                 INTERNET_OPEN_TYPE_PRECONFIG, 
									 NULL, 
									 NULL,
									 0);
   if (!hSession)
   {
	   return 5;
   }
   // 连接服务器
   HINTERNET hConnect = InternetConnect(hSession, 
	                                    ServerName, 
										INTERNET_DEFAULT_HTTP_PORT, 
										NULL, 
										NULL, 
										INTERNET_SERVICE_HTTP, 
										0, 
										1);
   if (!hConnect)
   {
	   return 2;
   }
   // 创建一个请求
   HINTERNET hRequest = HttpOpenRequest(hConnect,
	                                    Method,
										FormAction,
										HTTP_VERSION,
										NULL, 
										(const char**)&accept,
										0, 
										1);
   if (!hRequest)
   {
	   return 2;
   }
   // 发送请求
   BOOL bSendRequest = HttpSendRequest(hRequest,
	                                   hdrs,
									   strlen(hdrs),
									   frmdata,
									   strlen(frmdata));
   if (!bSendRequest)
   {
	   return 2;
   }

////////////////////////调试用/////////////////
#ifdef _DEBUG
   int bDoLoop = 1;
   LPTSTR szReadBuffer;
   DWORD lNumberOfBytesRead;
   FILE* f1;
   szReadBuffer = (LPTSTR) malloc(500);
   ZeroMemory(szReadBuffer, 500);
   if ((f1=fopen("c:\\test.htm", "w"))!=NULL)
   {
       while(bDoLoop)
	   {
		   bDoLoop = InternetReadFile(hRequest, szReadBuffer, 500, &lNumberOfBytesRead);
		   fseek(f1, 0L, SEEK_END);
		   fwrite(szReadBuffer, sizeof(szReadBuffer), lNumberOfBytesRead, f1); 
           if (lNumberOfBytesRead<500)
			   bDoLoop = 0;
	   }
   }
   fclose(f1);
   free(szReadBuffer);
#endif
//////////////////////////////////////////////////

   // 清除句柄
   if (hRequest)
       InternetCloseHandle(hRequest);
   if (hConnect)
       InternetCloseHandle(hConnect);
   if (hSession)
       InternetCloseHandle(hSession);

   return 0;
}
/*****************************************************************
* 函数介绍: 获取短信网关
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 网关列表: 每个网关以chr(10)+chr(13)分隔
                      开头为16字节的网关代号
					  中间为30字节的网关说明
					  最后为2字节的短信允许汉字个数
*****************************************************************/
SENDSMS_API char* CALLAGREEMENT GetGatewayList()
{
	int i;
	// 网易
	strcpy(GateWayList[0].Name, "163.com");
	strcpy(GateWayList[0].Comment, "网易短信网关");
	strcpy(GateWayList[0].Count, "50");
	// 搜狐
	strcpy(GateWayList[1].Name, "sohu.com");
	strcpy(GateWayList[1].Comment, "搜狐短信网关");
	strcpy(GateWayList[1].Count, "50");
    for (i=0; i<2; i++)
	{
		strcat(MyGateWay, GateWayList[i].Name);
		strcat(MyGateWay, GateWayList[i].Comment);
		strcat(MyGateWay, GateWayList[i].Count);
		strcat(MyGateWay, CLRF);
	}
    return MyGateWay;
}

/*****************************************************************
* 函数介绍: 发送短信函数
* 输入参数: char* lpGateway  - 发送网关名称
	        char* lpUserName - 发送者登陆账号
			char* lpPassword - 发送者登陆密码
			char* lpPhone    - 接收者手机号码
			char* lpContent  - 发送内容
			char* lpNickName - 发送者昵称
			char* lpExtent   - 扩展信息									  
* 输出参数: 无
* 返 回 值: int       00     - 操作完成,结果未知
                      01     - 网关代号不存在
					  02     - 网络连接超时
					  03     - 用户中止操作
					  04     - 网关/账号/手机/短信内容空白或非法
					  05     - 出现其他错误
*****************************************************************/
SENDSMS_API int CALLAGREEMENT SendSMS(char* lpGateway,  /*发送网关名称*/
				  					  char* lpUserName, /*发送者登陆账号*/
									  char* lpPassword, /*发送者登陆密码*/
									  char* lpPhone,    /*接收者手机号码*/
									  char* lpContent,  /*发送内容*/
									  char* lpNickName, /*发送者昵称*/
									  char* lpExtent    /*扩展信息*/
									  )
{
    int Result;
    static TCHAR hdrs[] = _T("Content-Type: application/x-www-form-urlencoded");
    static TCHAR accept[] = _T("Accept: */*");
    static TCHAR frmdata[1024];

	// 登陆姓名,密码等不允许为空
	if ((strlen(lpGateway)<=0)||(strlen(lpUserName)<=0)||(strlen(lpPassword)<=0)||(strlen(lpPhone)<=0)||(strlen(lpContent)<=0))
        return 4;

	// 选择网易网关发送
	if (strcmp(lpGateway, "163.com")==0)
	{
		// 登录短信发送系统
        sprintf(frmdata, "username=%s&password=%s", lpUserName, lpPassword);
        Result = doHTTP(hdrs, accept, "POST", frmdata, "reg4.163.com", "/in.jsp");
        
		// 发送短信
		if (strlen(lpNickName)>0)
			sprintf(frmdata, "send=1&phone=%s&message=%s--%s", lpPhone, lpContent, lpNickName);
		else
		    sprintf(frmdata, "send=1&phone=%s&message=%s", lpPhone, lpContent);
		Result = doHTTP(hdrs, accept, "POST", frmdata, "sms.163.com", "/service/sendmsg_pop.php");
		
		// 退出短信发送系统
		sprintf(frmdata, "username=%s", lpUserName);
        Result = doHTTP(hdrs, accept, "GET", frmdata, "reg4.163.com", "/Logout.jsp");

		return Result;
	}


	// 选择搜狐网关发送
	if (strcmp(lpGateway, "sohu.com")==0)
	{
        Result = 1;
        return Result;
	}

	// 网关代号不存在
	return 1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -