亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
欧美日韩一区高清| 欧美男生操女生| 日本不卡123| 国产精品久久一卡二卡| 欧美日韩久久久| 99麻豆久久久国产精品免费| 日本va欧美va精品发布| 亚洲男人的天堂网| 欧美韩国一区二区| 日韩欧美亚洲另类制服综合在线| 99视频精品在线| 国产精品亚洲一区二区三区妖精| 亚洲成人中文在线| 亚洲欧美怡红院| 国产欧美一区二区精品性| 欧美一区二区三区四区五区| 91精彩视频在线观看| 成人综合婷婷国产精品久久蜜臀| 日本vs亚洲vs韩国一区三区二区 | 中文欧美字幕免费| 日韩午夜小视频| 在线亚洲精品福利网址导航| 成人综合在线网站| 国产一区二区不卡老阿姨| 日韩黄色在线观看| 亚洲国产va精品久久久不卡综合 | 蜜臀久久99精品久久久久宅男| 有坂深雪av一区二区精品| 欧美国产欧美综合| 久久久国产精品午夜一区ai换脸| 日韩视频免费观看高清在线视频| 欧美日韩久久一区| 欧美日韩不卡一区二区| 欧美色偷偷大香| 欧美人妇做爰xxxⅹ性高电影 | 国产超碰在线一区| 国产裸体歌舞团一区二区| 国产曰批免费观看久久久| 麻豆精品一区二区三区| 美腿丝袜亚洲三区| 蜜臀av性久久久久蜜臀aⅴ四虎 | 一本久久a久久精品亚洲 | 91精品国产综合久久国产大片| 欧美系列亚洲系列| 欧美日韩在线观看一区二区 | 精品国产1区二区| 久久综合九色综合97_久久久| 久久色.com| 国产区在线观看成人精品| 久久精品视频一区| 国产女主播视频一区二区| 欧美国产精品一区二区| 国产精品美女一区二区三区| 国产精品久久久久久久久快鸭 | 久久精品久久99精品久久| 男女性色大片免费观看一区二区| 麻豆精品视频在线观看免费| 国产精品自产自拍| av激情综合网| 欧美午夜精品一区二区三区| 欧美日韩精品二区第二页| 日韩一区二区免费在线电影 | 亚洲精品菠萝久久久久久久| 久久综合中文字幕| 国产精品456| 不卡的av中国片| 成人精品国产一区二区4080| 不卡av在线免费观看| 日韩一卡二卡三卡| 久久久99精品免费观看不卡| 亚洲欧洲另类国产综合| 亚洲成人av免费| 亚洲成人动漫av| 婷婷久久综合九色国产成人| 精品一区二区三区蜜桃| 日本成人中文字幕| 极品少妇一区二区| 国产91清纯白嫩初高中在线观看| 国产剧情一区二区| 色综合久久久久综合| 91高清视频免费看| 在线视频一区二区三区| 日韩欧美一级精品久久| 欧美国产激情一区二区三区蜜月| 亚洲自拍与偷拍| 激情五月激情综合网| 99国产精品99久久久久久| 欧美午夜精品一区| 国产日韩欧美在线一区| 一区二区三区精密机械公司| 久久不见久久见免费视频7| 99久久精品一区| 欧美电影免费观看高清完整版在线观看| 久久嫩草精品久久久精品一| 亚洲综合偷拍欧美一区色| 国产美女精品一区二区三区| 日韩欧美中文字幕制服| 国产精品久久久久aaaa| 精彩视频一区二区| 6080日韩午夜伦伦午夜伦| 精品久久人人做人人爱| 日本精品一级二级| 欧美老人xxxx18| 一区二区三区四区蜜桃| 一本色道久久综合亚洲91| 国产一区二区三区黄视频| 日本在线观看不卡视频| 亚洲综合一区二区| 国产麻豆精品视频| 欧美情侣在线播放| 亚洲人成影院在线观看| 高潮精品一区videoshd| 91精品国产综合久久久蜜臀粉嫩| 国产精品白丝在线| 国产精品一二三四| 精品日韩一区二区三区免费视频| 亚洲国产一区视频| 91网址在线看| 精品欧美黑人一区二区三区| 国产在线视频一区二区| 国产精品久久久99| 99精品在线免费| 国产精品伦理在线| 日韩欧美你懂的| 欧美不卡一区二区| 久久久久久久免费视频了| 国产精品污www在线观看| 久久久.com| 国产亚洲精品aa| 国产高清一区日本| 欧美大胆一级视频| 极品少妇xxxx偷拍精品少妇| 国产精品传媒入口麻豆| 91精品国产色综合久久久蜜香臀| 免费欧美在线视频| 精品国产3级a| 日韩欧美国产午夜精品| 成人激情免费网站| 成人性生交大片免费看中文网站| 日韩欧美的一区二区| 日本在线不卡视频| 日韩欧美123| 美女一区二区三区| 精品福利一二区| 国产在线国偷精品产拍免费yy| 欧美mv日韩mv国产网站app| 久久aⅴ国产欧美74aaa| 精品国产髙清在线看国产毛片 | 欧美国产国产综合| 成人午夜看片网址| 椎名由奈av一区二区三区| 91老司机福利 在线| 亚洲一区在线观看免费| 欧美日韩一卡二卡三卡 | 石原莉奈在线亚洲三区| 91麻豆精品国产91久久久更新时间 | 国产精品性做久久久久久| 亚洲国产激情av| 91香蕉国产在线观看软件| 亚洲一区二区黄色| 日韩欧美激情在线| 国产精品一二三区| 亚洲精选免费视频| 这里是久久伊人| 国产精品一区免费视频| 亚洲欧美另类图片小说| 在线综合+亚洲+欧美中文字幕| 久久国产生活片100| 国产精品二三区| 欧美日韩和欧美的一区二区| 精品在线视频一区| 成人免费一区二区三区视频| 欧美日产国产精品| 国产最新精品精品你懂的| 中文字幕一区二区在线播放| 欧美视频完全免费看| 国产一区中文字幕| 亚洲男人的天堂av| 精品国产青草久久久久福利| av爱爱亚洲一区| 久久精品国产精品亚洲综合| 国产人成一区二区三区影院| 欧美日韩精品电影| 成人午夜精品在线| 青青草国产精品亚洲专区无| 亚洲私人影院在线观看| 欧美videos中文字幕| 在线视频亚洲一区| 国产精品99久久久久久久vr| 亚洲午夜电影网| 日本一区二区三区dvd视频在线| 欧美视频一区二| av电影在线观看完整版一区二区| 蜜臀av一区二区在线免费观看| 亚洲色图欧美在线| 久久一二三国产| 欧美肥大bbwbbw高潮| 一本一道综合狠狠老| 精品无人码麻豆乱码1区2区 | 欧美人与禽zozo性伦|