跨平台C 功能全面的Socket类库支持TCPUDP限速等等.docx
- 文档编号:28041092
- 上传时间:2023-07-07
- 格式:DOCX
- 页数:33
- 大小:19.09KB
跨平台C 功能全面的Socket类库支持TCPUDP限速等等.docx
《跨平台C 功能全面的Socket类库支持TCPUDP限速等等.docx》由会员分享,可在线阅读,更多相关《跨平台C 功能全面的Socket类库支持TCPUDP限速等等.docx(33页珍藏版)》请在冰豆网上搜索。
跨平台C功能全面的Socket类库支持TCPUDP限速等等
跨平台C++功能全面的Socket类库,支持TCP,UDP,限速等等
跨平台C++功能全面的Socket类库,支持TCP,UDP,限速等等
(2005-05-2611:
48:
28)转载▼#ifndef_MY_UTIL_
#define_MY_UTIL_
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<sys/timeb.h>#pragmawarning(disable:
4786)
#include<algorithm>
#include<vector>
#include<string>
#include<map>
#include<list>
#include<deque>
#include<set>
#include<utility>
#include<hash_map>
usingnamespacestd;#ifdefWIN32//WINDOWS
#define_WIN32_WINNT0x0501
#include<windows.h>
#include<process.h>
#include<winsock.h>
#definesocklen_tint
#definebzero(a,b)(memset((a),0,(b)))
#define
EWOULDBLOCK
WSAEWOULDBLOCK
#define
EINPROGRESS
WSAEINPROGRESS
#define
EALREADY
WSAEALREADY
#define
ENOTSOCK
WSAENOTSOCK
#define
EDESTADDRREQ
WSAEDESTADDRREQ
#define
EMSGSIZE
WSAEMSGSIZE
#define
EPROTOTYPE
WSAEPROTOTYPE
#define
ENOPROTOOPT
WSAENOPROTOOPT
#define
EPROTONOSUPPORT
WSAEPROTONOSUPPORT
#define
ESOCKTNOSUPPORT
WSAESOCKTNOSUPPORT
#define
EOPNOTSUPP
WSAEOPNOTSUPP
#define
EPFNOSUPPORT
WSAEPFNOSUPPORT
#define
EAFNOSUPPORT
WSAEAFNOSUPPORT
#define
EADDRINUSE
WSAEADDRINUSE
#define
EADDRNOTAVAIL
WSAEADDRNOTAVAIL
#define
ENETDOWN
WSAENETDOWN
#define
ENETUNREACH
WSAENETUNREACH
#define
ENETRESET
WSAENETRESET
#define
ECONNABORTED
WSAECONNABORTED
#define
ECONNRESET
WSAECONNRESET
#define
ENOBUFS
WSAENOBUFS
#define
EISCONN
WSAEISCONN
#define
ENOTCONN
WSAENOTCONN
#define
ESHUTDOWN
WSAESHUTDOWN
#define
ETOOMANYREFS
WSAETOOMANYREFS
#define
ETIMEDOUT
WSAETIMEDOUT
#define
ECONNREFUSED
WSAECONNREFUSED
#define
ELOOP
WSAELOOP
#ifndefENAMETOOLONG
//#define
ENAMETOOLONG
WSAENAMETOOLONG
#endif
#define
EHOSTDOWN
WSAEHOSTDOWN
#define
EHOSTUNREACH
WSAEHOSTUNREACH
#ifndefENOTEMPTY
//#define
ENOTEMPTY
WSAENOTEMPTY
#endif
#define
EPROCLIM
WSAEPROCLIM
#define
EUSERS
WSAEUSERS
#define
EDQUOT
WSAEDQUOT
#define
ESTALE
WSAESTALE
#define
EREMOTE
WSAEREMOTE
#else
//LINUX
#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<pthread.h>
#include<signal.h>
#include<sys/ioctl.h>
#include<stddef.h>
#include<sys/types.h>
#include<sys/uio.h>
#include<errno.h>
#defineSOCKETint
#defineWSAGetLastError()
errno
#define
INVALID_SOCKET
(-1)
#define
SOCKET_ERROR
(-1)
#endif
#defineTIMEOUT_NONE0
#defineTIMEOUT_ALL1
#defineTIMEOUT_ACCEPT2
#defineTIMEOUT_SEND3
#defineTIMEOUT_RECV4
#defineTIMEOUT_CONNECT5
#defineALLTIMEOUT120*1000
//120seconds
#defineRECVTIMEOUT
120*1000
#defineSENDTIMEOUT
120*1000
#defineACCPTTIMEOUT
120*1000
#defineCONNECTTIMEOUT120*1000
#defineMAXBUFFERSIZE65536
#defineLISTENQNUM128
classMSockAddr
{
public:
MSockAddr()
{
}
MSockAddr(sockaddr_inaddr)
:
m_addr(addr)
{
}
MSockAddr(char*lpszIp,unsignedshort
port)
{
structsockaddr_in
addr;
bzero(&addr,sizeof(addr));
m_addr.sin_family=
AF_INET;
m_addr.sin_addr.s_addr=
inet_addr(lpszIp);
m_addr.sin_port=
htons(port);
}
MSockAddr(unsignedlongIp,unsignedshort
port)
{
structsockaddr_in
addr;
bzero(&addr,sizeof(addr));
m_addr.sin_family=
AF_INET;
m_addr.sin_addr.s_addr=
htonl(Ip);
m_addr.sin_port=
htons(port);
}
MSockAddr(string&host,unsignedshort
port)
{
memset(&m_addr,0,sizeof(m_addr));
m_addr.sin_family=AF_INET;
if(host=="")
m_addr.sin_addr.s_addr=INADDR_ANY;
elseif((m_addr.sin_addr.s_addr=
inet_addr(host.c_str()))==(unsignedlong)(-1))
{
hostent*hp=gethostbyname(host.c_str());
if(hp==0)
return;
memcpy(&(m_addr.sin_addr.s_addr),
hp->h_addr,hp->h_length);
}
m_addr.sin_port=htons(port);
}
char*GetIPStr()const
{
returninet_ntoa(m_addr.sin_addr);
}
stringToString()
{
charresult[256];
sprintf(result,"%u.%u.%u.%u:
%d",m_addr.sin_addr.s_addr&0xff,(m_addr.sin_addr.s_addr>>8)&0xff,(m_addr.sin_addr.s_addr>>16)&0xff,(m_addr.sin_addr.s_addr>>24)&0xff,GetPort());
returnstring(result);
}
unsignedlongGetIP()const
{return
ntohl(m_addr.sin_addr.s_addr);}
unsignedshortGetPort()const{return
ntohs(m_addr.sin_port);}
sockaddr_inGetAddr(){return
m_addr;}
voidSetAddr(sockaddr_in
addr){m_addr=addr;}
booloperator==(constMSockAddrcmper)const
{
return
(GetIP()==cmper.GetIP())&&(GetPort()==cmper.GetPort());
}
booloperator!
=(constMSockAddrcmper)const
{
return
(GetIP()!
=cmper.GetIP())||(GetPort()!
=cmper.GetPort());
}
voidoperator=(MSockAddrcmper)
{
m_addr=cmper.GetAddr();
}
private:
sockaddr_inm_addr;
};
classMSockErr{
intm_err;
public:
MSockErr():
m_err(0)
{}
MSockErr(inte):
m_err(e)
{}
intErrCode()const{returnm_err;
}
constchar*ToString()const
{
#ifdefWIN32
LPVOIDlpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER|
FORMAT_MESSAGE_FROM_SYSTEM|
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
m_err,
MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),//
Defaultlanguage
(LPTSTR)&lpMsgBuf,
0,
NULL
);
return(char*)lpMsgBuf;
#else
returnstrerror(m_err);
#endif
}
};
classMBlockSocket
{
public:
MBlockSocket():
_bUDP(false),
_binit(false),
_bkilled(false),
_bBlock(true),
_nTimeOut(0),
_socket(-1),
_nTimeOutType(TIMEOUT_NONE)
{
Init();
}
MBlockSocket(boolbUDP):
_bUDP(bUDP),
_binit(false),
_bkilled(false),
_bBlock(true),
_nTimeOut(0),
_socket(-1),
_nTimeOutType(TIMEOUT_NONE)
{
Init();
if(_bUDP)
Create(SOCK_DGRAM);
else
Create();
}
virtual~MBlockSocket()
{
Close();
}
voidInit()
{
m_tLastPacket=time(NULL);
m_nSendSpeedBs=0;
m_nRecvSpeedBs=0;
m_nSendBytesCount=0;
m_nRecvBytesCount=0;
m_nMaxSendBs=0x7FFFFFFF;
m_nMaxRecvBs=
0x7FFFFFFF;
m_nRecvBytesCount
=0;
m_nSendBytesCount
=0;
}
bool_bUDP;
bool_binit;
bool_bkilled;
bool_bBlock;
int_nTimeOut;
int_nTimeOutType;
SOCKET_socket;
structsockaddr_in
_cliaddr;//hostbe
aserver
MSockAddr_servaddr;
structsockaddr_in
_remaddr;//hostbe
aclient
MSockAddr_locaaddr;
staticboolInitSocketSystem()
{
#ifdefWIN32
WSADATAwsadata;
unsignedshortwinsock_version=0x0101;
if(WSAStartup(winsock_version,&wsadata))
{
returnfalse;
}
#endif
returntrue;
}
intSetBlock(boolbBlock=true)
{
intbufsize=
MAXBUFFERSIZE;
setsockopt(_socket,SOL_SOCKET,SO_RCVBUF,
(char*)&bufsize,sizeof(bufsize));
setsockopt(_socket,SOL_SOCKET,SO_SNDBUF,
(char*)&bufsize,sizeof(bufsize));
intrt;
if
(!
bBlock)//Nonblockingmode
{
unsignedlongrb=1;//nonzero
#ifdefWIN32
rt=ioctlsocket(_socket,FIONBIO,
&rb);
#else
rt=ioctl(_socket,FIONBIO,
&rb);
#endif
}
returnrt;
}
time_tm_tLastPacket;
//!
Lastsendcounttime
time_tm_tLastSendCount;
time_tm_tLastRecvCount;
//!
Maxsendspeedinonesecond.
unsignedlongm_nMaxSendBs;
unsignedlongm_nMaxRecvBs;
//!
countbytessincelastsendcounttime
unsignedlongm_nSendBytesCount;
unsignedlongm_nRecvBytesCount;
//!
currentsendspeed,Bs
unsignedlongm_nSendSpeedBs;
unsignedlongm_nRecvSpeedBs;
voidSetSendSpeed(unsignedlongMaxSendBs)
{
if(MaxSendBs)
m_nMaxSendBs=MaxSendBs;
}
voidSetRecvSpeed(unsignedlongMaxRecvBs)
{
if(MaxRecvBs)
m_nMaxRecvBs=MaxRecvBs;
}
unsignedlongGetSendSpeed()
{
if(m_nSendSpeedBs==0)
{
if(time(NULL)!
=m_tLastSendCount)
m_nSendSpeedBs=m_nSendBytesCount/(time(NULL)-m_tLastSendCount);
else
m_nSendSpeedBs=m_nSendBytesCount;
}
returnm_nSendSpeedBs;
}
intSetTimeOut(intms=0,inttype=
TIMEOUT_ALL)
{
if(ms!
=
0){
_nTimeOut=ms;
}
else
{
_nTimeOut=ALLTIMEOUT;
}
return_nTimeOut;
}
inlineintSetsockopt(intlevel,intoptname,
constchar*optval,intoptlen)
{
return
setsockopt(_socket,level,optname,optval,optlen);
}
boolCreate(inttype=SOCK_STREAM)
{
_socket=
socket(AF_INET,type,0);
if(_socket!
=
INVALID_SOCKET){
_binit=true;
if(type!
=SOCK_STREAM)
_bUDP=true;
returntrue;
}
returnfalse;
}
intClose()
{
if(!
_binit)
return0;
_binit=false;
#ifdefWIN32
return
closesocket(_socket);
#else
return
close(_socket);
#endif
}
voidAttach(SOCKETsocket)
{
Close();
_socket=socket;
if(socket!
=
INVALID_SOCKET)
_binit=true;
}
SOCKETDetach()
{
SOCKETrt=_socket;
_binit=false;
_socket=
INVALID_SOCKET;
returnrt;
}
//Ifnoerroroccurs,thisfunctionreturnszero.
//Ifanerroroccurs,itreturnsSOCKET_ERROR,
//andaspecificerrorcodecanberetrievedbycalling
WSAGetLastError.
intBind(constsockaddr*name,int
namelen)
{
intflag=1;
setsockopt(_socket,
SOL_SOCKET,SO_REUSEADDR,(char*)&flag,
sizeof(flag));
returnbind(_socket,
name,namelen);
}
intBind(unsignedshortport,char*lpszIp=
NULL)
{
structsockaddr_in
addr;
bzero(&addr,sizeof(addr));
addr.sin_family=
AF_INET;
if(lpszIp==
NULL)
addr.sin_addr.s_addr=htonl(INADDR_ANY);
else
addr.sin_addr.s_addr=inet_addr(lpszIp);
addr.sin_port=
htons(port);
return
Bind((sockaddr*)&addr,sizeof(addr));
}
//Ifnoerroroccurs,listenreturnszero.Otherwise,avalue
ofSOCKET_ERRORisreturned
intListen(intbacklog=LISTENQNUM)
{
returnlisten(_socket,
backlog);
}
//prtshouldbedeletebycaller
MBlockSocket*Accept()
{
socklen_tclilen;
structsockaddr_in
cliaddr;
clilen=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 跨平台C 功能全面的Socket类库支持TCPUDP限速等等 平台 功能 全面 Socket 支持 TCPUDP 限速 等等