外部网络工作模块
封装了select模型,最大支持3个socket,
分发消息类型
/*
用户调用API
*/
#ifndef __MY_NETWORK_H__
#define __MY_NETWORK_H__
#include "CMyNetModual.h"
//支持最大socket个数
#define MAX_NET 3
//支持4K数据一起发送
/*POST数据时要填充的结构体*/
struct NET_DATA_STRUCT
{
char *data;
int len;
};
class CMyNetWork{
public:
CMyNetWork();
~CMyNetWork();
//循环检测socket事件
void run(void);
//创建 返回索引
//mode是1(tcp) or 0(udps)
//生成cmynetMoudel socket对象,调用连接,
int CreateNet(char *Address, int port, int mode, NET_CALLBACK callback, char* postContent = NULL, int postlen = 0);
//删除index对应的socket
int DeleteNet(int index);
//http: 判断接收成功与否 200 206返回1 其它返回 0
//socket: 返回1 不用调用
int isSuccess(int index);
int isInDownload( int index );
void NetCallback( CMyNetModual* net,int event, int index, void* buf, int len );
//返回下载百分比(0-100)
int GetDownLoadRate(int index );
//设置超时时间 默认是NETOUTTIMES (60*60)
void SetTimeOut(int time);
//TCP UDP数据发送
int Send(int index, void* data, int len);
//设置回调函数
int SetNetCallBack( int index, void* callback );
public:
CMyNetModual *net_obj[MAX_NET]; //允许同时有3个网络工作
int net_time; //网络超时时间
private:
int Create(char *Address, int port, int mode, NET_CALLBACK callback,char* postContent, int postlen);
};
#endif
http协议报文
#define HTTP_HEAD_STRING "%s %s HTTP/1.1\r\n\
Host: %s \r\n\
Accept: */* \r\n\
Content-Length: %d\r\n\
Connection: keep-alive \r\n\r\n"
#define TEST_HEAD "GET /help HTTP/1.1\r\n\
Host: 10.0.0.247:8000\r\n\
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20100101 Firefox/21.0\r\n\
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n\
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3\r\n\
Accept-Encoding: gzip, deflate\r\n\
Connection: keep-alive\r\n\
Cache-Control: max-age=0\r\n\r\n"
#define TEST_POST_HEAD "POST /user?token=1380185955 HTTP/1.1\r\nHost: 112.124.39.46\r\nAccept: */*\r\nContent-Length: 8\r\nConnection: keep-alive\r\n\r\n"
CMyNetWork初始化网络模块
<pre name="code" class="cpp">CMyNetWork::CMyNetWork()
{
net_time = NETOUTTIMES;
memset( net_obj, 0, sizeof(CMyNetModual *)*MAX_NET );
#ifdef _WIN32
static int isInitSocketFlag = 0;
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested =MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
#endif
}
CMyNetWork::~CMyNetWork()
{
for ( int i = 0; i < MAX_NET; i++ )
{
if ( net_obj[i] )
{
net_obj[i]->Close();
DeleteNet( i );
net_obj[i] = NULL;
}
}
}
//生成cmynetMoudel socket对象,调用socket对象连接
//创建 返回索引
//mode: TCP_MODE, UDP_MODE, HTTP_GET_MODE, HTTP_HOST_MODE
int CMyNetWork::CreateNet(char *Address, int port, int mode, NET_CALLBACK callback, char* postContent, int postlen)
{
//检查参数合法性 callback不能为空 后面不用判断此回调
if ( callback == NULL || Address == NULL || port == 0 || mode == 0 )
{
return -1;
}
int index = Create(Address, port, mo