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

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

?? cmppsocket_vc.cpp

?? CMPP3.0協議源碼下載(VC/BCB)支持CMPP_CONNECT,CMPP_TERMINATE,CMPP_SUBMIT,CMPP_ACTIVATE,CMPP_DELIVER等幾條常用指令
?? 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一区二区三区免费野_久草精品视频
538在线一区二区精品国产| 国产精品美女一区二区三区| 精品久久一区二区三区| 国产精品久久精品日日| 偷窥国产亚洲免费视频| 国产丶欧美丶日本不卡视频| 欧美三级欧美一级| 国产精品久久久久久久裸模| 国内一区二区视频| 欧美日本韩国一区二区三区视频| 国产精品美女久久久久久| 国内精品第一页| 欧美日韩国产精选| 亚洲蜜臀av乱码久久精品蜜桃| 国产一区91精品张津瑜| 日韩欧美一区二区在线视频| 亚洲国产你懂的| www.在线成人| 中文av一区特黄| 狠狠色2019综合网| 欧美mv和日韩mv国产网站| 婷婷久久综合九色综合绿巨人| 色一区在线观看| 亚洲精品日韩一| 色狠狠综合天天综合综合| 亚洲国产成人在线| 成人福利电影精品一区二区在线观看| 欧美精品一区二区三区四区| 蜜臀久久99精品久久久久久9| 欧美日韩国产一级| 日韩精品免费专区| 欧美一级精品大片| 免费日韩伦理电影| 日韩一区二区电影在线| 久久99最新地址| 欧美刺激午夜性久久久久久久| 日本美女一区二区三区视频| 欧美精品在线观看播放| 日本不卡中文字幕| 日韩情涩欧美日韩视频| 精品一区二区三区免费毛片爱| 欧美一区二区三区成人| 久久精品av麻豆的观看方式| 日韩欧美一卡二卡| 国产二区国产一区在线观看| 日本一二三四高清不卡| 91在线视频观看| 亚洲妇女屁股眼交7| 91精品国产综合久久精品图片| 视频精品一区二区| 欧美xxxxxxxx| 成人性生交大片免费看中文网站| 亚洲欧美一区二区三区国产精品 | 国产丝袜在线精品| 成人在线视频首页| 亚洲综合丁香婷婷六月香| 欧美美女激情18p| 精品亚洲porn| 国产精品乱人伦| 欧美午夜精品一区二区三区| 亚洲成av人片在线观看无码| 日韩欧美久久久| 懂色av中文一区二区三区| 中文字幕一区二区视频| 欧美日韩免费不卡视频一区二区三区| 免费在线欧美视频| 国产欧美一二三区| 欧美日韩你懂得| 国产精品一区二区男女羞羞无遮挡 | 国产高清无密码一区二区三区| 国产精品全国免费观看高清| 欧美性大战久久久久久久蜜臀| 日韩成人一区二区三区在线观看| 日韩一区二区三区视频| fc2成人免费人成在线观看播放| 午夜精品久久久久久| 国产亚洲美州欧州综合国| 欧美亚洲国产bt| 国产v日产∨综合v精品视频| 亚洲一区在线视频| 国产欧美一区二区精品仙草咪| 欧美日韩一区二区电影| 成人综合激情网| 毛片一区二区三区| 亚洲精品欧美在线| 中文字幕欧美日韩一区| 欧美tickling挠脚心丨vk| 91色视频在线| 福利视频网站一区二区三区| 免费美女久久99| 一区二区成人在线观看| 国产精品午夜在线| 26uuu欧美| 91精品国产色综合久久不卡电影 | 国产校园另类小说区| 欧美理论在线播放| 色综合久久88色综合天天免费| 久久www免费人成看片高清| 一卡二卡三卡日韩欧美| 国产精品成人网| 国产人伦精品一区二区| 久久亚区不卡日本| 日韩精品在线一区| 欧美人体做爰大胆视频| 91国产福利在线| 91视视频在线直接观看在线看网页在线看| 奇米精品一区二区三区在线观看| 一区二区三区在线免费视频| 国产精品国产三级国产普通话三级| 精品久久人人做人人爽| 欧美一级淫片007| 51久久夜色精品国产麻豆| 欧美色电影在线| 欧美性受xxxx| 欧美日韩视频在线一区二区| 在线视频亚洲一区| 在线看日韩精品电影| 在线观看www91| 欧美视频一区在线观看| 欧美三级视频在线播放| 欧美疯狂做受xxxx富婆| 91精品国产色综合久久不卡蜜臀| 在线成人av影院| 欧美一区二区视频在线观看| 欧美一级国产精品| 久久久久88色偷偷免费| 欧美激情一区二区三区不卡| 日本一区二区电影| 亚洲蜜臀av乱码久久精品蜜桃| 亚洲资源在线观看| 天天av天天翘天天综合网色鬼国产| 丝袜美腿亚洲综合| 极品尤物av久久免费看| 成人黄色小视频| 欧美午夜一区二区三区| 欧美一区二区三区播放老司机| 精品捆绑美女sm三区| 中文字幕的久久| 亚洲va在线va天堂| 精品一二线国产| 不卡影院免费观看| 欧美麻豆精品久久久久久| 日韩精品一区二区三区swag| 国产亚洲欧美日韩在线一区| 亚洲女与黑人做爰| 视频一区在线视频| 国产大陆亚洲精品国产| 91欧美激情一区二区三区成人| 欧美日韩不卡在线| 欧美激情一区二区三区蜜桃视频| 亚洲精品视频免费观看| 麻豆成人综合网| av男人天堂一区| 欧美一区二区免费视频| 国产精品久久久一本精品| 久久国产尿小便嘘嘘| 成人黄色大片在线观看| 欧美精品日韩一本| 国产精品免费丝袜| 日韩经典一区二区| aaa亚洲精品| 日韩一区二区在线看片| 成人免费一区二区三区视频 | 成人性生交大片免费看在线播放| 亚洲国产精品久久久男人的天堂 | 欧美一区二区三区男人的天堂| 欧美性色综合网| 日韩精品一区二区三区中文不卡| 国产精品久久免费看| 亚洲一区中文在线| 成人黄色777网| 亚洲精品中文字幕乱码三区 | 麻豆91精品91久久久的内涵| 亚洲二区视频在线| 国产在线不卡一区| 欧美久久久久久久久中文字幕| 国产亚洲va综合人人澡精品| 国产一区二区三区观看| 91精品国产综合久久久久久久久久 | 韩国视频一区二区| 91论坛在线播放| 在线电影一区二区三区| 久久精品视频一区二区| 麻豆久久久久久久| 欧美成人vps| 国产精一区二区三区| 精品日韩欧美在线| 国产在线视频精品一区| 日韩视频免费直播| 久久精工是国产品牌吗| 久久久99精品免费观看| 美国av一区二区| 日韩和欧美的一区| 久久精品一二三| 国产成人av资源| 国产亚洲欧美一级| 国产成人啪免费观看软件 | 亚洲一区二区四区蜜桃| 成人午夜短视频| 国产精品女同互慰在线看|