📄 tcpsock.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 + -