亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? cmppsocket.cpp

?? GSM短信息發送的VC源碼
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
/******************************************************************************
  FileName                : CcmppSocket.cpp
  Description             : 短消息發送程序
  Version                 : 1.0
  Date                    : 2004年4月6日
  Author                  : 潘昱宇
  Other                   : 只支持CMPP 3.0
							編譯開關 單字節對齊 ,連接Ws2_32.lib.
  Email					  : rebbie@163.com
******************************************************************************/

#include "stdafx.h"

#include <stdlib.h>
#ifdef _DEBUG
#include <iterator>
#include <list>
#include <string>
#include <iostream>
#include <fstream>
#include <ostream>
#endif


#include <time.h>
#include "md5.h"
#include "cmppsocket.h"
//將接收的數據dump 到 _revdebug[]

#ifdef _DEBUG
using namespace std;
char _revdebug[1024*1024];
char * _revp=_revdebug;
std::list<std::string> _dbgeventlst;
char _dbgtemp[100];

std::ostream& operator<<(std::ostream& out, const std::list<std::string>& l)
{
    std::copy(l.begin(), l.end(),
        ostream_iterator<std::string,char> (out,"\n"));
    return out;
}
#endif

CcmppSocket::CcmppSocket()
{
    #ifdef _DEBUG
        _dbgeventlst.push_back("Begin Class CcmppSocket Constructor.");
    #endif

	//	初始化私有變量
	_binitialized = false;
	_bexitting = false;
	_seqid	= 0;
	memset( (void *)_window, 0, sizeof( _window));
	InitializeCriticalSection( &_csec_wnd);
	InitializeCriticalSection( &_csec_snd);
	InitializeCriticalSection( &_csec_recv);
	InitializeCriticalSection( &_csec_seq);
	_hsema_wnd = CreateSemaphore(			//	創建計數信號量
		NULL,
		nCMPP_WINDOW_SIZE,
		nCMPP_WINDOW_SIZE,
		NULL);
	_hevnt_data = CreateEvent(				//	創建提示發送的事件
		NULL,
		false,
		false,
		NULL);
	//	初始化網絡
	WSADATA wsaData;
	WSAStartup( MAKEWORD( 2, 2 ), &wsaData );
    #ifdef _DEBUG
        _dbgeventlst.push_back("End   Class CcmppSocket Constructor.");
    #endif
}

CcmppSocket::~CcmppSocket()
{
	//	發送CMPP_TERMINATE,從服務器注銷
    #ifdef _DEBUG
        _dbgeventlst.push_back("Begin Class CcmppSocket Desstructor.");
    #endif
	if( _binitialized)
		_exit();
	WSACleanup();
	//	清除臨界區等
	DeleteCriticalSection( &_csec_wnd);
	DeleteCriticalSection( &_csec_snd);
	DeleteCriticalSection( &_csec_recv);
	DeleteCriticalSection( &_csec_seq);
	CloseHandle( _hsema_wnd);
	CloseHandle( _hevnt_data);
    #ifdef _DEBUG
        _dbgeventlst.push_back("Begin Class CcmppSocket Desstructor.");
    #endif
}

/******************************************************************************
  spid		企業代碼		例如:901001
  passwd	登陸口令		例如:test
  ismg		短信網關的地址,例如:127.0.0.1
  port		短信網關的端口,例如:7890
******************************************************************************/
int CcmppSocket::init( char *spid, char *passwd, char *ismg, unsigned short port)
{
	//	如果接口已經初始化,則先刪除接口
    #ifdef _DEBUG
        _dbgeventlst.push_back("Connection Initializtion Begin.");
    #endif
	if( _binitialized)
		_exit();
	int err;
    #ifdef _DEBUG
        _dbgeventlst.push_back("Connect To GateWay Server.");
    #endif
	err = _connect( ismg, port);
	if( err != 0)
    {
        #ifdef _DEBUG
            sprintf(_dbgtemp,"Connect To GateWay Server Fail. Error Code=%d.",WSAGetLastError());
            _dbgeventlst.push_back(_dbgtemp);
        #endif
		return eCMPP_INIT_CONNECT;
    }
    #ifdef _DEBUG
        _dbgeventlst.push_back("Login To GateWay Server Begin.");
    #endif

	err = _login( spid, passwd);
	if( err != 0)
	{
        #ifdef _DEBUG
            sprintf(_dbgtemp,"    Connect To GateWay Server Fail Return Code=%d Error Code=%d.",err,WSAGetLastError());
            _dbgeventlst.push_back(_dbgtemp);
        #endif
		closesocket( _soc);
		return err;
	}
    #ifdef _DEBUG
        _dbgeventlst.push_back("Login To GateWay Server Success.");
    #endif
	//	保存配置,以備后用
	strcpy( _spid,	spid);
	strcpy( _passwd,passwd);
	strcpy( _ismg,	ismg);
	_port = port;
	//	啟動發送、接收數據的線程
    #ifdef _DEBUG
        _dbgeventlst.push_back("Begin Thread Send SMS.");
    #endif
	_hsend = CreateThread(	//	短信發送線程
		NULL,
		NULL,
		thread_send,
		(LPVOID)this,
		0,
		NULL);
    #ifdef _DEBUG
        _dbgeventlst.push_back("Begin Thread Recieve SMS.");
    #endif
	_hrecv = CreateThread(	//	短信接收線程
		NULL,
		NULL,
		thread_recv,
		(LPVOID)this,
		0,
		NULL);
    #ifdef _DEBUG
        _dbgeventlst.push_back("Begin Thread Activate.");
    #endif
	_hactv = CreateThread(	//	鏈路檢查
		NULL,
		NULL,
		thread_actv,
		(LPVOID)this,
		0,
		NULL);
	//	初始化成功,設置成功標志
	_binitialized = true;
	//	放棄當前時間片
	Sleep( 0);

    #ifdef _DEBUG
        _dbgeventlst.push_back("Connection Initializtion Success.");
    #endif
	return eCMPP_INIT_OK;
}

/******************************************************************************
  msg				向服務器提交的數據
  dwMilliseconds	在成功的將數據插入數據窗口前等待的時間

  返回值			描述
  ===============	==============================		
  0					成功
  eCMPP_NEED_INIT	接口未初始化
  WAIT_TIMEOUT		操作超時
  WAIT_ABANDONED	工作線程異常退出,可能是網絡故障
******************************************************************************/
int	CcmppSocket::Submit( CMPP_SUBMIT &msg, DWORD dwMilliseconds)
{
	CMPP_PACKAGE	pkg;
	CMPP_HEAD		&head = (CMPP_HEAD		&)pkg.head;
	int	err, nsize;

	if(!_binitialized)
		return eCMPP_NEED_INIT;

	pkg.n = 3;							//	發送失敗,則重發兩次
	pkg.t = time( NULL);				//	立即發送

	nsize = sizeof( CMPP_HEAD) + sizeof( CMPP_SUBMIT);
	//	因為CMPP協議中包的長度是可變的,而我定義的數據結構中
	//	包的長度采用的是最大長度,所以這里需要修正
	nsize = nsize + msg.msglen - sizeof( msg.msgcontent);
	head.size = htonl( nsize);
	head.cmdid= htonl( nCMPP_SUBMIT);
	head.seqid= htonl( _getseqid());

	memcpy( (void *)pkg.data, (void *)&msg, sizeof( msg));
	//	將最后8個字節的保留數據拷貝到適當的位置
	memcpy(
		(void *)(pkg.data + nsize - sizeof( msg.reserve) - sizeof( CMPP_HEAD)),
		(void *)msg.reserve,
		sizeof( msg.reserve));
	//	等候數據發送窗口的空位
	err = WaitForSingleObject( _hsema_wnd, dwMilliseconds);
	//	等待超時或程序異常
	if( err != WAIT_OBJECT_0)
		return err;
	//	申請數據發送窗口的使用權
	EnterCriticalSection( &_csec_wnd);
	for( int i=0; i<nCMPP_WINDOW_SIZE; i++)
	{
		//	找到一個空位
		if( _window[i].head.cmdid == 0)
			break;
	}
	memcpy( (void *)&_window[i], (void *)&pkg, sizeof( pkg));
	LeaveCriticalSection( &_csec_wnd);
	//	喚醒數據發送線程
	PulseEvent( _hevnt_data);

	return 0;
}

int CcmppSocket::_connect( char *ismg, unsigned short port)
{
	int err;
	struct sockaddr_in addr;

	_soc = socket( AF_INET, SOCK_STREAM, 0);

	addr.sin_family = AF_INET;
	addr.sin_port   = htons( port);
	addr.sin_addr.s_addr   = inet_addr( ismg);

	err = connect( _soc, (struct sockaddr *)&addr, sizeof( addr));
	return err;
}

int CcmppSocket::_login( char *spid, char *passwd)
{
	CMPP_PACKAGE	pkg;
	CMPP_CONNECT	&msg = *(CMPP_CONNECT	*)pkg.data;
	int err, nsize;

	MD5 ctx;
	char authsrc[50], *pos, timestr[20];

	memset( (void *)&msg, 0, sizeof( &msg));

	nsize = sizeof( pkg.head) + sizeof( msg);
	pkg.head.size  = htonl( nsize);
	pkg.head.cmdid = htonl( nCMPP_CONNECT);
	pkg.head.seqid = htonl( _getseqid());

	strcpy( (char *)msg.spid, spid);
	//	計算單向HASH函數的值
	memset( authsrc, 0, sizeof( authsrc));
	strcpy( authsrc, spid);
	pos = authsrc + strlen( spid) + 9;
	strcpy( (char *)pos, passwd);
	pos += strlen( passwd);
	strcpy( pos, _timestamp( timestr ));
	pos += strlen( timestr);

	ctx.update( (unsigned char *)authsrc, (int)(pos - authsrc) );
	ctx.finalize();
	ctx.raw_digest( msg.digest);

	msg.ver = nCMPP_VERSION;
	msg.timestamp = htonl( atol( timestr));
	//	發送身份驗證數據
	err = _send( (char *)&pkg, nsize);
	if( err != nsize)
		return eCMPP_INIT_CONNECT;

	//	接收返回的數據包
	CMPP_CONNECT_RESP &msgresp = *(CMPP_CONNECT_RESP *)pkg.data;
	
	nsize = sizeof(CMPP_HEAD) + sizeof(CMPP_CONNECT_RESP) - 3; //???????

	err = _recv( (char *)&pkg, nsize);
	if( err != nsize )
		return eCMPP_INIT_CONNECT;

	return ntohl( msgresp.status);
}

void CcmppSocket::_exit()
{
	HANDLE	threads[] = { _hsend, _hrecv, _hactv};
	int		i,
			nthreads;
	//	請求工作線程退出
	_bexitting = true;

	Sleep( 1000);
	//	關閉請求,強制結束所有尚未退出的線程
	_bexitting = false;

	nthreads = sizeof( threads) / sizeof( HANDLE);
	for( i=0; i<nthreads; i++)
	{
		TerminateThread( threads[i], 0);
		CloseHandle( threads[i]);
	}
	//	注銷
	_logout();
	closesocket( _soc);
}

void CcmppSocket::_logout()
{
	CMPP_HEAD	msg;
	int			err, nsize;

	nsize = sizeof( msg);
	msg.size  = htonl( nsize);
	msg.cmdid = htonl( nCMPP_TERMINATE);
	msg.seqid = htonl( _getseqid());

	err = _send( (char *)&msg, sizeof( msg));
	if( err != nsize)
		return;

	err = _recv( (char *)&msg, sizeof( msg));

	return;
}

/******************************************************************************
  數據發送線程

  對于新提交的數據報,立即發送
  超過60秒未收到回應,則重發
******************************************************************************/
DWORD	WINAPI	CcmppSocket::thread_send( LPVOID pdata)
{
	CcmppSocket		&cmpp = *( CcmppSocket *)pdata;
	CMPP_PACKAGE	window[nCMPP_WINDOW_SIZE];
	int	i;
	int	err;
	int	nsize;
	int	dwMilliseconds = 1000;		//	輪詢間隔為1000毫秒
	for( ;;)
	{
		//	輪詢間隔1秒
		err = WaitForSingleObject(
			cmpp._hevnt_data,
			dwMilliseconds);
		//	出錯了,結束線程
		if( err == WAIT_FAILED)
			break;
		//	申請數據發送窗口的使用權

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品va天堂亚洲国产| 一区二区三区四区在线播放| 欧美激情综合在线| 亚洲男人的天堂av| 国产精品综合久久| 欧美日韩一卡二卡三卡 | 欧美影院精品一区| 久久尤物电影视频在线观看| 亚洲精品第一国产综合野| 久久不见久久见免费视频7| 日本韩国欧美一区| 久久这里只有精品首页| 亚洲电影在线免费观看| 成人激情av网| 久久久精品黄色| 美腿丝袜亚洲综合| 欧美性一二三区| 中文字幕亚洲区| 国产激情视频一区二区三区欧美 | 国产精品色哟哟网站| 奇米四色…亚洲| 欧美日韩在线一区二区| 亚洲四区在线观看| 国产成人精品免费视频网站| 欧美成人女星排名| 久久黄色级2电影| 91超碰这里只有精品国产| 一区二区三区蜜桃| 日本韩国欧美一区| 亚洲图片欧美综合| 欧美亚洲一区三区| 一区二区三区在线看| 在线视频欧美区| 亚洲免费观看高清完整版在线观看熊| 成人免费观看视频| 国产精品女同互慰在线看| 国产成人精品一区二区三区网站观看 | 久久99久久久久久久久久久| 欧美欧美欧美欧美首页| 亚洲国产成人va在线观看天堂| 99re8在线精品视频免费播放| 欧美激情中文不卡| www.欧美日韩国产在线| 国产精品视频你懂的| jlzzjlzz欧美大全| 亚洲一区日韩精品中文字幕| 91精品国产综合久久久久久 | 在线国产电影不卡| 亚洲成人av福利| 日韩欧美一区二区不卡| 国产专区欧美精品| 中文字幕一区二区三| 欧美中文字幕久久| 蜜桃久久久久久久| 中文字幕+乱码+中文字幕一区| 97久久精品人人做人人爽50路| 一区二区三区四区在线免费观看 | 欧美日韩电影在线| 久久99久久久久久久久久久| 欧美激情一区在线| 欧美伊人久久大香线蕉综合69| 日韩av中文在线观看| 久久夜色精品国产欧美乱极品| 国产精品一区二区在线观看网站| 国产精品国产自产拍高清av王其| 欧美在线观看一二区| 麻豆91免费观看| 国产精品精品国产色婷婷| 欧美日韩色一区| 国产精品影音先锋| 亚洲香蕉伊在人在线观| 26uuu欧美| 日本高清不卡视频| 国产永久精品大片wwwapp| 一区二区三区资源| 精品av久久707| 欧美亚洲一区二区在线| 国产精品一区一区| 亚洲午夜久久久久| 国产精品成人网| 日韩三级电影网址| 欧美最新大片在线看 | av一区二区不卡| 奇米色777欧美一区二区| 国产精品高潮呻吟久久| 91精品国产综合久久久久久| 99久久久无码国产精品| 久久 天天综合| 亚洲mv在线观看| 国产精品久久久久久久岛一牛影视| 日韩亚洲欧美在线观看| 欧美在线综合视频| 91丝袜呻吟高潮美腿白嫩在线观看| 九色综合狠狠综合久久| 图片区日韩欧美亚洲| 亚洲色图欧洲色图婷婷| 国产免费久久精品| 欧美成人精品福利| 91精品国产综合久久精品麻豆| 91色视频在线| 97超碰欧美中文字幕| 国产精品一卡二| 久久超碰97中文字幕| 蜜臀91精品一区二区三区| 亚洲va欧美va人人爽| 日韩欧美成人激情| 91精品国产综合久久福利软件 | 精品一区二区三区免费观看| 日精品一区二区三区| 亚洲一二三四久久| 一区二区三区高清在线| 亚洲久本草在线中文字幕| 国产精品久久国产精麻豆99网站 | 欧美日韩精品高清| 欧美色爱综合网| 欧美乱熟臀69xxxxxx| 欧美日韩久久一区| 在线不卡一区二区| 欧美精品1区2区3区| 91精品国产色综合久久ai换脸| 欧美日产国产精品| 日韩精品中午字幕| 久久综合色一综合色88| 久久久久亚洲蜜桃| 亚洲国产精品成人综合| 亚洲欧美自拍偷拍| 亚洲宅男天堂在线观看无病毒| 亚洲第一激情av| 蜜桃久久久久久| 国产成人精品亚洲午夜麻豆| 99视频精品全部免费在线| 色噜噜狠狠色综合欧洲selulu| 91福利在线观看| 91麻豆精品国产| 久久免费午夜影院| 成人欧美一区二区三区视频网页| 国产精品初高中害羞小美女文| 一区二区三区久久久| 精彩视频一区二区三区| 国产福利精品一区二区| 色88888久久久久久影院野外| 在线观看亚洲专区| 日韩亚洲欧美一区二区三区| 国产女人18毛片水真多成人如厕| 综合色天天鬼久久鬼色| 日韩av在线发布| 成人国产精品免费网站| 欧美日韩一区久久| 精品国产伦一区二区三区免费 | 欧美精品一区二区在线观看| 久久在线观看免费| 亚洲线精品一区二区三区| 久久99久久久久久久久久久| 不卡一区中文字幕| 日韩一二在线观看| 中文字幕视频一区| 蜜臀av亚洲一区中文字幕| 成人黄色综合网站| 日韩一卡二卡三卡| 亚洲精品日韩综合观看成人91| 日本不卡123| 色一情一伦一子一伦一区| 精品国产免费一区二区三区四区| 亚洲欧洲综合另类| 国产一区二区福利| 在线不卡欧美精品一区二区三区| 中文在线免费一区三区高中清不卡| 亚洲国产一区二区在线播放| 国产精品自拍网站| 91精品国产欧美一区二区| 亚洲免费在线看| 成人精品鲁一区一区二区| 欧美精品 国产精品| 中文字幕一区二区三区精华液| 老司机精品视频导航| 欧美日韩综合不卡| 亚洲欧美另类在线| 成人av在线一区二区| 精品国产乱码久久久久久图片| 午夜伊人狠狠久久| 亚洲精品一区二区三区蜜桃下载| 亚洲在线免费播放| 99精品欧美一区二区蜜桃免费| 国产亚洲精久久久久久| 久久精品免费观看| 欧美理论在线播放| 一区二区三区久久久| 不卡av在线免费观看| 国产三级三级三级精品8ⅰ区| 日韩电影在线免费看| 欧美日韩久久久一区| 亚洲午夜电影网| 欧美午夜视频网站| 亚洲午夜免费福利视频| 色综合天天综合| 亚洲视频资源在线| 99re视频这里只有精品| 国产精品国产成人国产三级| 成人高清视频在线观看| 国产精品三级视频|