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

📄 mysocket.cpp

📁 在Linux下使用GCC编制的FTP服务器
💻 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 + -