📄 mysocket.cpp
字号:
// MySocket.cpp: implementation of the CMySocket class.
//
//////////////////////////////////////////////////////////////////////
#include "MySocket.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
////////////////>>
CMySocket::CMySocket()
{
m_hSocket=INVALID_SOCKET;
}
CMySocket::~CMySocket()
{
Close();
}
int CMySocket::Create()
{
Close();
m_hSocket=socket(AF_INET,SOCK_STREAM,0);
if(m_hSocket!=INVALID_SOCKET)
return 0;
return m_hSocket;
}
int CMySocket::Close()
{
if (m_hSocket!=INVALID_SOCKET)
{
//printf("CMySocket()::Close();\n");
//shutdown(m_hSocket,SHUT_RDWR);
close(m_hSocket);
m_hSocket = INVALID_SOCKET;
}
return 0;
}
int CMySocket::Connect(const char *pszSvrAddr,unsigned nSvrPort)
{
unsigned nIp=0;
AddrStr2Int(pszSvrAddr,nIp);
return Connect(nIp,nSvrPort);
}
int CMySocket::Connect(unsigned nSvrIp,unsigned nSvrPort)
{
sockaddr_in sockAddr;
//
memset(&sockAddr,0,sizeof(sockAddr));
//绑定
sockAddr.sin_port = 0;
sockAddr.sin_family = AF_INET;
sockAddr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(m_hSocket, (sockaddr *)&sockAddr,sizeof(sockAddr));
//连接
sockAddr.sin_addr.s_addr = htonl(nSvrIp);
sockAddr.sin_port = htons((unsigned short)nSvrPort);
return connect(m_hSocket,(sockaddr *)&sockAddr, sizeof(sockAddr));
}
int CMySocket::Recv(void *pvBuf, int iSize)
{
return recv(m_hSocket, (char *)pvBuf, iSize,0);
}
int CMySocket::RecvLine(char *pszDst,int iSize){
char chBuf;
int iRet,iCount=0;
while(iSize>1){
if((iRet=Recv(&chBuf,1))!=1)
return iRet;
iCount++;
if(chBuf=='\r')
continue;
if(chBuf=='\n')
break;
*pszDst++=chBuf;
iSize--;
}
*pszDst=0;
return iCount;
}
int CMySocket::Send(const void *pvBuf, int iSize)
{
return send(m_hSocket,(char *)pvBuf,iSize,0);
}
int CMySocket::Send(const char *pszBuf)
{
return Send(pszBuf,strlen(pszBuf));
}
//0:both
//1:readtimeout
//2:writetimeout
int CMySocket::SetTimeout(int iTime,unsigned nType)
{
int iRet;
timeval tv;
tv.tv_sec=iTime/1000;
tv.tv_usec=(iTime%1000)*1000;
if(nType & TIMEOUT_RECV){
iRet=setsockopt(m_hSocket,SOL_SOCKET,SO_RCVTIMEO,(char *)&tv,sizeof(tv));
if(iRet!=0){
return iRet;
}
}
if(nType & TIMEOUT_SEND){
iRet=setsockopt(m_hSocket,SOL_SOCKET,SO_SNDTIMEO,(char *)&tv,sizeof(tv));
if(iRet!=0){
return iRet;
}
}
return 0;
}
int CMySocket::Listen(unsigned nPort)
{
sockaddr_in addrSvr;
int iRet;
addrSvr.sin_port = htons(nPort);
addrSvr.sin_family = AF_INET;
addrSvr.sin_addr.s_addr = htonl(INADDR_ANY);
iRet = bind(m_hSocket, (sockaddr *)&addrSvr,sizeof(addrSvr));
if(iRet!=0)
return iRet;
iRet = listen(m_hSocket, SOMAXCONN);
if (iRet !=0)
return iRet;
return 0;
}
int CMySocket::Attach(SOCKET hSocket)
{
if(m_hSocket!=INVALID_SOCKET)
return -1;
m_hSocket=hSocket;
return 0;
}
SOCKET CMySocket::Detach()
{
SOCKET sockRet=m_hSocket;
m_hSocket=INVALID_SOCKET;
return sockRet;
}
int CMySocket::Accept(CMySocket *pSock)
{
return pSock->Attach(Accept());
}
SOCKET CMySocket::Accept()
{
return accept(m_hSocket,NULL,NULL);
}
int CMySocket::SetOpt(int nOptName,void *pvOptVal,int iSize)
{
return setsockopt(m_hSocket,SOL_SOCKET,nOptName,(char *)pvOptVal,iSize);
}
int CMySocket::GetOpt(int nOptName,void *pvOptVal){
unsigned nSize;
return getsockopt(m_hSocket,SOL_SOCKET,nOptName,(char *)pvOptVal,&nSize);
}
int CMySocket::AddrStr2Int(const char *pszAddr, unsigned &nIp)
{
hostent *pHostEnt;
//
if((pHostEnt=gethostbyname(pszAddr))!=NULL)
{
nIp=ntohl(*(unsigned *)(pHostEnt->h_addr));
return 0;
}
return -1;
}
char *CMySocket::AddrInt2Str(unsigned nIp, char *pszAddr)
{
//like inet_ntoa
unsigned char *pIp=(unsigned char *)&nIp;
sprintf(pszAddr,"%u.%u.%u.%u",pIp[3],pIp[2],pIp[1],pIp[0]);
return pszAddr;
}
int CMySocket::Sendf(const char *pszFormat,...)
{
char szBuf[1600];//比一个IP包稍大一点
va_list lstArg;
va_start(lstArg,pszFormat);
if(vsnprintf(szBuf,
sizeof(szBuf),
pszFormat,
lstArg)<0)
return -1;
va_end(lstArg);
return Send(szBuf);
}
int CMySocket::SetBlockMode(bool bBlock)
{
int flags=fcntl(m_hSocket,F_GETFL,0);
return fcntl(m_hSocket,F_SETFL,flags|O_NONBLOCK);
}
int CMySocket::Bind(unsigned nPort)
{
sockaddr_in addr={0};
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(nPort);
return bind(m_hSocket,(sockaddr *)&addr, sizeof(addr));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -