- 1、本文档共24页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
跨平台的游戏客户端Socket封装
依照惯例,先上代码:
[cpp] view plaincopyprint?
#pragma once?
?
#ifdef WIN32?
#include windows.h?
#include WinSock.h?
#else?
#include sys/socket.h?
#include fcntl.h?
#include errno.h?
#include netinet/in.h?
#include arpa/inet.h?
?
#define SOCKET int?
#define SOCKET_ERROR -1?
#define INVALID_SOCKET -1?
?
#endif?
?
#ifndef CHECKF?
#define CHECKF(x) \?
??? do \?
{ \?
??? if (!(x)) { \?
??? log_msg(CHECKF, #x, __FILE__, __LINE__); \?
??? return 0; \?
??? } \?
} while (0)?
#endif?
?
#define _MAX_MSGSIZE 16 * 1024????? // 暂定一个消息最大为16k?
#define BLOCKSECONDS??? 30????????? // INIT函数阻塞时间?
#define INBUFSIZE?? (64*1024)?????? //? 具体尺寸根据剖面报告调整? 接收数据的缓存?
#define OUTBUFSIZE? (8*1024)??????? //? 具体尺寸根据剖面报告调整。 发送数据的缓存,当不超过8K时,FLUSH只需要SEND一次?
?
class CGameSocket {?
public:?
??? CGameSocket(void);?
??? bool??? Create(constchar* pszServerIP, int nServerPort, int nBlockSec = BLOCKSECONDS, bool bKeepAlive = false);?
??? bool??? SendMsg(void* pBuf, int nSize);?
??? bool??? ReceiveMsg(void* pBuf, int nSize);?
??? bool??? Flush(void);?
??? bool??? Check(void);?
??? void??? Destroy(void);?
??? SOCKET? GetSocket(void) const { return m_sockClient; }?
private:?
??? bool??? recvFromSock(void);???? // 从网络中读取尽可能多的数据?
??? bool??? hasError();???????? // 是否发生错误,注意,异步模式未完成非错误?
??? void??? closeSocket();?
?
??? SOCKET? m_sockClient;?
?
??? // 发送数据缓冲?
??? char??? m_bufOutput[OUTBUFSIZE];??? //? 可优化为指针数组?
??? int???? m_nOutbufLen;?
?
??? // 环形缓冲区?
??? char??? m_bufInput[INBUFSIZE];?
??? int???? m_nInbufLen;?
??? int???? m_nInbufStart;????????????? // INBUF使用循环式队列,该变量为队列起点,0 - (SIZE-1)?
};?
#pragma once
#ifdef WIN32
#include windows.h
#include WinSock.h
#else
#include sys/socket.h
#include fcntl.h
#include errno.h
#include netinet/in.h
#include arpa/inet.h
#define SOCKET int
#define SOCKET_ERROR -1
#define INVALID_SOCKET -1
#endif
#ifndef CHECKF
#define CHECKF(x) \
do \
{ \
if (!(x)) { \
log_msg(CHECKF, #x, __FILE__, __LINE__
文档评论(0)