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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? cmppsocket_bcb.cpp

?? CMPP3.0協(xié)議源碼下載(VC/BCB)支持CMPP_CONNECT,CMPP_TERMINATE,CMPP_SUBMIT,CMPP_ACTIVATE,CMPP_DELIVER等幾條常用指令
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
/******************************************************************************
  FileName                : CcmppSocket.cpp
  Description             : 短消息發(fā)送程序
  Version                 : 1.0
  Date                    : 2004年4月6日
  Author                  : 潘昱宇
  Other                   : 只支持CMPP 3.0   for BCB6
                            編譯條件: 單字節(jié)對齊,取消循環(huán)變量作用域限定,MFC兼容模式
  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_bcb.h"
//將接收的數(shù)據(jù)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(			//	創(chuàng)建計數(shù)信號量
		NULL,
		nCMPP_WINDOW_SIZE,
		nCMPP_WINDOW_SIZE,
		NULL);
	_hevnt_data = CreateEvent(				//	創(chuàng)建提示發(fā)送的事件
		NULL,
		false,
		false,
		NULL);
	//	初始化網(wǎng)絡(luò)
	WSADATA wsaData;
	WSAStartup( MAKEWORD( 2, 2 ), &wsaData );
    #ifdef _DEBUG
        _dbgeventlst.push_back("End   Class CcmppSocket Constructor.");
    #endif
}

CcmppSocket::~CcmppSocket()
{
	//	發(fā)送CMPP_TERMINATE,從服務(wù)器注銷
    #ifdef _DEBUG
        _dbgeventlst.push_back("Begin Class CcmppSocket Desstructor.");
    #endif
	if( _binitialized)
		_exit();
	WSACleanup();
	//	清除臨界區(qū)等
	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		企業(yè)代碼		例如:901001
  passwd	登陸口令		例如:test
  ismg		短信網(wǎng)關(guān)的地址,例如:127.0.0.1
  port		短信網(wǎng)關(guān)的端口,例如:7890
******************************************************************************/
int CcmppSocket::init( char *spid, char *passwd, char *ismg, unsigned short port)
{
	//	如果接口已經(jīng)初始化,則先刪除接口
    #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;
	//	啟動發(fā)送、接收數(shù)據(jù)的線程
    #ifdef _DEBUG
        _dbgeventlst.push_back("Begin Thread Send SMS.");
    #endif
	_hsend = CreateThread(	//	短信發(fā)送線程
		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);
	//	初始化成功,設(shè)置成功標志
	_binitialized = true;
	//	放棄當前時間片
	Sleep( 0);

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

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

  返回值			描述
  ===============	==============================		
  0					成功
  eCMPP_NEED_INIT	接口未初始化
  WAIT_TIMEOUT		操作超時
  WAIT_ABANDONED	工作線程異常退出,可能是網(wǎng)絡(luò)故障
******************************************************************************/
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;							//	發(fā)送失敗,則重發(fā)兩次
	pkg.t = time( NULL);				//	立即發(fā)送

	nsize = sizeof( CMPP_HEAD) + sizeof( CMPP_SUBMIT);
	//	因為CMPP協(xié)議中包的長度是可變的,而我定義的數(shù)據(jù)結(jié)構(gòu)中
	//	包的長度采用的是最大長度,所以這里需要修正
	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個字節(jié)的保留數(shù)據(jù)拷貝到適當?shù)奈恢?	memcpy(
		(void *)(pkg.data + nsize - sizeof( msg.reserve) - sizeof( CMPP_HEAD)),
		(void *)msg.reserve,
		sizeof( msg.reserve));
	//	等候數(shù)據(jù)發(fā)送窗口的空位
	err = WaitForSingleObject( _hsema_wnd, dwMilliseconds);
	//	等待超時或程序異常
	if( err != WAIT_OBJECT_0)
		return err;
	//	申請數(shù)據(jù)發(fā)送窗口的使用權(quán)
	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);
	//	喚醒數(shù)據(jù)發(fā)送線程
	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( CMPP_HEAD) + sizeof( CMPP_CONNECT);
	pkg.head.size  = htonl( nsize);
	pkg.head.cmdid = htonl( nCMPP_CONNECT);
	pkg.head.seqid = htonl( _getseqid());

	strcpy( (char *)msg.spid, spid);
	//	計算單向HASH函數(shù)的值
	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));
	//	發(fā)送身份驗證數(shù)據(jù)
	err = _send( (char *)&pkg, nsize);
	if( err != nsize)
		return eCMPP_INIT_CONNECT;

	//	接收返回的數(shù)據(jù)包
	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);
	//	關(guān)閉請求,強制結(jié)束所有尚未退出的線程
	_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;
}

/******************************************************************************
  數(shù)據(jù)發(fā)送線程

  對于新提交的數(shù)據(jù)報,立即發(fā)送
  超過60秒未收到回應,則重發(fā)
******************************************************************************/
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);
		//	出錯了,結(jié)束線程
		if( err == WAIT_FAILED)
			break;
		//	申請數(shù)據(jù)發(fā)送窗口的使用權(quán)
		EnterCriticalSection( &cmpp._csec_wnd);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品美女久久久久aⅴ| 国产精品福利一区| 色老汉一区二区三区| 韩国v欧美v日本v亚洲v| 一区二区在线观看视频在线观看| 日韩欧美亚洲国产精品字幕久久久| 波多野结衣一区二区三区 | 日韩二区三区四区| 中文字幕一区av| 精品国产乱码久久久久久老虎| 欧美综合亚洲图片综合区| 成人教育av在线| 精品一区二区三区视频| 亚洲电影第三页| 亚洲视频一区在线观看| 国产欧美中文在线| 亚洲精品一区二区三区影院| 91精品国产综合久久福利软件| 在线精品视频一区二区三四| 99国产精品久久久| www.色综合.com| 暴力调教一区二区三区| 国产.欧美.日韩| 国产麻豆视频一区二区| 狠狠色丁香婷综合久久| 五月天激情综合| 亚洲高清免费在线| 亚洲伊人伊色伊影伊综合网| 亚洲精品你懂的| 成人欧美一区二区三区白人| 国产清纯美女被跳蛋高潮一区二区久久w| 日韩一区和二区| 欧美大片一区二区三区| 日韩欧美中文字幕公布| 精品入口麻豆88视频| 欧美成人欧美edvon| 精品乱码亚洲一区二区不卡| 欧美一级欧美三级在线观看| 日韩视频在线观看一区二区| 日韩欧美在线影院| 精品免费国产二区三区| 欧美精品一区男女天堂| 久久久影视传媒| 欧美激情资源网| 国产精品不卡在线| 亚洲欧美国产高清| 波多野结衣在线aⅴ中文字幕不卡| 国产成人综合精品三级| 国产99精品国产| 91美女片黄在线| 欧美精品一级二级三级| 欧美一区二区三区免费在线看| 日韩免费观看高清完整版在线观看| 精品88久久久久88久久久| 久久久午夜精品理论片中文字幕| 国产精品女同一区二区三区| 亚洲人被黑人高潮完整版| 亚洲成人精品影院| 久久se这里有精品| 成人午夜大片免费观看| 91浏览器入口在线观看| 制服.丝袜.亚洲.中文.综合| 久久日韩粉嫩一区二区三区| 国产精品污www在线观看| 亚洲一区在线视频| 久久国产尿小便嘘嘘| 成人午夜视频福利| 欧洲在线/亚洲| 日韩免费高清电影| 欧美极品美女视频| 亚洲一级二级在线| 狠狠狠色丁香婷婷综合激情| 99re在线精品| 日韩欧美国产一区二区三区| 国产日产欧产精品推荐色| 亚洲一区二区三区四区五区中文| 男男gaygay亚洲| av在线播放成人| 91精品国产91久久久久久最新毛片 | 亚洲人午夜精品天堂一二香蕉| 亚洲一区二区视频| 国产精品一二三在| 色婷婷综合激情| 亚洲精品一区二区精华| 一区二区三区蜜桃| 国产精品一二一区| 欧美精品三级日韩久久| 国产精品久久久久久久久搜平片| 奇米一区二区三区av| 91美女视频网站| 精品国产乱码久久久久久久| 亚洲国产一区二区在线播放| 成人免费视频国产在线观看| 制服丝袜中文字幕一区| 亚洲欧美国产77777| 国产美女视频一区| 欧美日韩免费观看一区二区三区| 国产精品无遮挡| 久热成人在线视频| 欧美日韩国产一级二级| 亚洲人成在线观看一区二区| 国产精品一区三区| 日韩一级在线观看| 亚洲成av人在线观看| www.亚洲色图.com| 国产欧美一区二区精品性色| 蜜臀av亚洲一区中文字幕| 色吊一区二区三区| 最新久久zyz资源站| 国产剧情一区二区| 日韩欧美一二三| 日韩vs国产vs欧美| 欧美日韩激情一区二区三区| 成人福利电影精品一区二区在线观看| 日韩片之四级片| 日本成人超碰在线观看| 欧美性淫爽ww久久久久无| 国产精品伦理一区二区| 国产很黄免费观看久久| 欧美精品一区视频| 国内外成人在线| 亚洲精品在线观| 国产一区三区三区| 精品国产一区二区精华| 久久精品免费观看| 精品国产一区二区三区忘忧草| 午夜精品一区二区三区三上悠亚| 欧美视频你懂的| 亚洲福利国产精品| 欧美日韩国产首页| 日本中文字幕一区二区有限公司| 精品婷婷伊人一区三区三| 午夜精品久久一牛影视| 精品视频一区二区不卡| 婷婷综合另类小说色区| 69堂国产成人免费视频| 日韩精彩视频在线观看| 欧美丰满美乳xxx高潮www| 蜜臀av一区二区三区| 精品久久久久久最新网址| 韩国女主播一区二区三区| 久久人人超碰精品| 国产91高潮流白浆在线麻豆| 中文字幕一区二区三区四区不卡| 不卡视频免费播放| 一区二区三区四区中文字幕| 欧美日韩一级视频| 奇米精品一区二区三区在线观看 | 亚洲综合成人在线视频| 欧美日韩国产一区| 美腿丝袜在线亚洲一区| 久久久影视传媒| 99久久99久久精品国产片果冻| 亚洲乱码日产精品bd| 911精品国产一区二区在线| 久久精品国产一区二区| 久久久久久97三级| 色94色欧美sute亚洲线路一ni| 亚洲一区免费观看| 日韩免费视频一区| www.66久久| 日韩在线一区二区三区| 国产亚洲精品bt天堂精选| 97久久超碰国产精品电影| 日韩精品一级中文字幕精品视频免费观看| 欧美一区二区视频在线观看2020| 国内久久精品视频| 亚洲三级电影网站| 日韩欧美国产wwwww| 成人高清在线视频| 亚洲高清不卡在线| 国产日产欧美一区二区视频| 欧美在线观看一区| 国产美女精品在线| 亚洲图片有声小说| 国产欧美一区二区精品性色 | 久久福利视频一区二区| 国产精品久久久久久久久久免费看 | 日韩一二三区不卡| 成人性色生活片| 日本亚洲三级在线| 国产色91在线| 欧美高清性hdvideosex| jlzzjlzz亚洲女人18| 欧洲av一区二区嗯嗯嗯啊| 激情综合网av| 亚洲午夜精品网| 国产欧美精品一区| 91精品国产综合久久国产大片 | 日韩天堂在线观看| 色老汉一区二区三区| 国产精品996| 日av在线不卡| 亚洲精品国产第一综合99久久| 久久久www成人免费无遮挡大片| 欧美色爱综合网| 99久久综合99久久综合网站| 国产麻豆9l精品三级站| 日日摸夜夜添夜夜添精品视频| 亚洲日韩欧美一区二区在线|