⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tcpsock.cpp

📁 在UBTUNTU下
💻 CPP
字号:
// TcpSock.cpp: implementation of the CTcpSock class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "TcpSock.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

////////////////>>

CTcpSock::CTcpSock()
{
    m_hSocket=INVALID_SOCKET;
}

CTcpSock::~CTcpSock()
{
    Close();
}

int CTcpSock::Create()
{
	Close();
	m_hSocket=socket(AF_INET,SOCK_STREAM,0);
	if(m_hSocket!=INVALID_SOCKET)
		return 0;
	return m_hSocket;
}

int CTcpSock::Close()
{
	if (m_hSocket!=INVALID_SOCKET)
    {
		shutdown(m_hSocket,SHUT_RDWR);
		close(m_hSocket);
		m_hSocket = INVALID_SOCKET;
	}
	return 0;
}

int CTcpSock::Connect(const char *pszSvrAddr,unsigned nSvrPort)
{
    unsigned nIp=0;
    AddrStr2Int(pszSvrAddr,nIp);
	return Connect(nIp,nSvrPort);
}

int CTcpSock::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 CTcpSock::Recv(void *pvBuf, int iSize)
{
    return recv(m_hSocket, (char *)pvBuf, iSize,0);
}


int CTcpSock::Send(const void *pvBuf, int iSize)
{
    return send(m_hSocket,(char *)pvBuf,iSize,0);
}   

//0:both
//1:readtimeout
//2:writetimeout
int CTcpSock::SetTimeout(int iTime,unsigned nType)
{
	int iRet;
    if(nType & TIMEOUT_RECV){
        iRet=setsockopt(m_hSocket,SOL_SOCKET,SO_RCVTIMEO,(char *)&iTime,sizeof(iTime));
		if(iRet!=0){
			return iRet;
		}
	}
    if(nType & TIMEOUT_SEND){
        iRet=setsockopt(m_hSocket,SOL_SOCKET,SO_SNDTIMEO,(char *)&iTime,sizeof(iTime));
		if(iRet!=0){
			return iRet;
		}
	}
    return 0;
}

int CTcpSock::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 CTcpSock::Attach(SOCKET hSocket)
{
	if(m_hSocket!=INVALID_SOCKET)
		return -1;
    m_hSocket=hSocket;
    return 0;
}

SOCKET CTcpSock::Detach()
{
	SOCKET sockRet=m_hSocket;
	m_hSocket=INVALID_SOCKET;
	return sockRet;
}

int CTcpSock::Accept(CTcpSock *pSock)
{
    return pSock->Attach(Accept());
}

SOCKET CTcpSock::Accept()
{
   return accept(m_hSocket,NULL,NULL);
}

int CTcpSock::SetOpt(int nOptName,void *pvOptVal,int iSize)
{
    return setsockopt(m_hSocket,SOL_SOCKET,nOptName,(char *)pvOptVal,iSize);
}
int CTcpSock::GetOpt(int nOptName,void *pvOptVal){
	unsigned nSize;
    return getsockopt(m_hSocket,SOL_SOCKET,nOptName,(char *)pvOptVal,&nSize);
}

int CTcpSock::AddrStr2Int(const char *pszAddr, unsigned &nIp)
{
	hostent *pHostEnt;
	//
	if((pHostEnt=gethostbyname(pszAddr))!=NULL){
		nIp=ntohl(*(unsigned *)(pHostEnt->h_addr));
		return 0;
	}
    return -1;
}

char *CTcpSock::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;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -