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

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

?? cmppsocket_vc.cpp

?? 中國移動CMPP3.0協議源碼免費下載
?? 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 <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_VC.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);

	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;
		//	申請數據發送窗口的使用權
		EnterCriticalSection( &cmpp._csec_wnd);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
9人人澡人人爽人人精品| 日韩一区二区在线观看视频播放| caoporn国产一区二区| 欧美体内she精高潮| 欧美tickling网站挠脚心| 亚洲精品高清在线观看| 国产精品1024| 欧美一区二区三级| 亚洲韩国一区二区三区| 成人福利电影精品一区二区在线观看| 8x福利精品第一导航| 亚洲欧美一区二区三区国产精品| 精品伊人久久久久7777人| 欧美日韩日日摸| 亚洲婷婷在线视频| 国产激情精品久久久第一区二区| 国产日韩欧美电影| 蜜桃视频免费观看一区| 欧美精品在线视频| 一区二区三区四区在线免费观看 | 日韩欧美国产麻豆| 一区二区三区精品视频在线| 波波电影院一区二区三区| 久久色视频免费观看| 热久久国产精品| 91精品欧美福利在线观看| 一区二区激情小说| 日本大香伊一区二区三区| 最新中文字幕一区二区三区 | 图片区小说区国产精品视频| 99久久精品免费精品国产| 欧美高清在线一区二区| 国产精品99久久久久久久vr| 精品处破学生在线二十三| 九九在线精品视频| 欧美精品一区二区三区在线播放| 老司机精品视频导航| 欧美mv日韩mv国产| 韩国av一区二区三区在线观看| 日韩美女视频在线| 国产一区二区三区免费播放| 久久免费的精品国产v∧| 国产精品原创巨作av| 国产喷白浆一区二区三区| 国产河南妇女毛片精品久久久| 国产亚洲1区2区3区| 成人a免费在线看| 伊人婷婷欧美激情| 欧美人体做爰大胆视频| 免费观看久久久4p| 久久久99精品久久| 国产成人啪免费观看软件| 亚洲国产高清不卡| 91天堂素人约啪| 亚洲国产综合在线| 日韩欧美一级在线播放| 国产一二三精品| 国产精品国产a级| 欧美视频在线观看一区| 捆绑调教美女网站视频一区| 欧美高清在线精品一区| 色婷婷综合视频在线观看| 肉色丝袜一区二区| 久久久久国色av免费看影院| 91女厕偷拍女厕偷拍高清| 亚洲尤物视频在线| 69堂精品视频| 国产一区在线观看视频| 中文字幕第一区综合| 久久精品国产77777蜜臀| 久久久国产一区二区三区四区小说 | 国产米奇在线777精品观看| 亚洲视频一二区| 制服丝袜亚洲网站| 成人白浆超碰人人人人| 五月天一区二区三区| 久久精品亚洲国产奇米99| 欧美亚洲综合色| 国产原创一区二区| 亚洲国产精品麻豆| 国产日产欧美一区二区三区| 欧美猛男男办公室激情| 国产**成人网毛片九色 | 亚洲人成伊人成综合网小说| 欧美一级片在线| 一本久久a久久免费精品不卡| 麻豆精品一二三| 亚洲第一福利视频在线| 中文字幕第一页久久| 欧美大片一区二区| 欧美系列在线观看| www.成人在线| 国产成人亚洲精品狼色在线| 男女男精品网站| 亚洲一区二区中文在线| 国产精品美女久久久久久久久 | 欧美激情一区不卡| 欧美一区二区观看视频| 欧美视频一二三区| 92精品国产成人观看免费| 国产精一品亚洲二区在线视频| 免费国产亚洲视频| 偷拍日韩校园综合在线| 有码一区二区三区| 亚洲精品国产一区二区精华液| 中文字幕高清一区| 国产精品理论在线观看| 久久久精品国产免大香伊| 精品久久久久久久久久久久久久久 | 国产精品免费网站在线观看| 精品毛片乱码1区2区3区| 欧美日韩大陆一区二区| 在线免费精品视频| 色婷婷精品大在线视频| 色妹子一区二区| 在线看国产一区二区| 色94色欧美sute亚洲线路一ni| 91在线无精精品入口| 色悠悠久久综合| 欧美亚洲国产一区二区三区 | 亚洲一区二区成人在线观看| 亚洲少妇屁股交4| 综合久久久久久| 亚洲自拍偷拍图区| 午夜精品久久久久久久99水蜜桃| 夜夜操天天操亚洲| 香蕉久久夜色精品国产使用方法| 亚洲国产成人av| 日本在线观看不卡视频| 久久精品噜噜噜成人av农村| 国产在线精品国自产拍免费| 国产91高潮流白浆在线麻豆| fc2成人免费人成在线观看播放 | 91超碰这里只有精品国产| 91精品一区二区三区在线观看| 日韩一区二区三区四区五区六区| 欧美成人一区二区三区片免费| 久久免费视频一区| 亚洲视频免费在线| 免费不卡在线观看| 从欧美一区二区三区| 欧洲一区二区av| 日韩欧美123| 亚洲视频一区二区在线观看| 午夜成人在线视频| 国产精品99久久久久久有的能看| 99精品久久只有精品| 7777女厕盗摄久久久| 久久综合久久综合久久| 亚洲人精品一区| 久久精品国产澳门| 欧美电影免费提供在线观看| 久久综合精品国产一区二区三区| 成人欧美一区二区三区| 日韩av中文字幕一区二区三区| 国产高清在线观看免费不卡| 日本精品一区二区三区高清| www一区二区| 亚洲欧美国产77777| 老司机精品视频导航| 一本色道a无线码一区v| 精品国产伦理网| 一区二区三区四区亚洲| 国产一区二区导航在线播放| 色一情一乱一乱一91av| 久久久国产一区二区三区四区小说 | 亚洲电影在线免费观看| 国产99精品在线观看| 欧美一级在线视频| 18成人在线视频| 国产乱妇无码大片在线观看| 欧美色视频在线| 亚洲视频一二区| 成人美女视频在线观看18| 日韩精品中文字幕在线不卡尤物| 亚洲免费av在线| 不卡电影一区二区三区| 精品久久久久一区| 日韩成人免费电影| 在线看国产日韩| 亚洲免费视频中文字幕| 国产大陆亚洲精品国产| 日韩一级黄色大片| 亚洲va在线va天堂| 色综合久久久久综合体| 国产精品美女久久久久aⅴ| 精品午夜一区二区三区在线观看| 337p亚洲精品色噜噜噜| 亚洲在线视频一区| 在线免费精品视频| 亚洲最大成人网4388xx| 色综合久久99| 亚洲伦理在线免费看| av不卡在线播放| 国产精品不卡在线| 成人免费三级在线| 国产精品麻豆久久久| 波多野结衣一区二区三区| 日韩精品1区2区3区| 欧美麻豆精品久久久久久|