CSockets类重写CSocket

#include <winsock2.h>
#pragma comment (lib,"ws2_32.lib")


class CSockets  
{
private:
SOCKET m_sock;
public:
CSockets();
virtual ~CSockets();


bool Creates( UINT nSocketPort=0,//端口
int nSocketType = SOCK_STREAM,//是TCP还是UDP
LPCTSTR lpszSocketAddress = NULL);//创建的IP地址


bool Bind( UINT nSocketPort, LPCTSTR lpszSocketAddress = NULL );
int Send( const void* lpBuf, int nBufLen, int nFlags = 0 );


bool Accept( CSockets& rConnectedSocket,//引用的输出参数用来接收发送的socket
SOCKADDR* lpSockAddr = NULL,//连接的IP地址
int* lpSockAddrLen = NULL);//连接IP地址它的数据大小的地址
bool Connect( LPCTSTR lpszHostAddress, UINT nHostPort );



int Receive( void* lpBuf, int nBufLen, int nFlags = 0 );


int SendTo( const void* lpBuf,//发送字节的大小
int nBufLen,//字节的长度
UINT nHostPort,//端口
LPCTSTR lpszHostAddress = NULL,//要发送的地址
int nFlags = 0 );
bool Getpeername( char* lpSockAddr, UINT& rPeerPort );
bool Getsockname( char * lpSockAddr, UINT& rSocketPort );










SOCKET GetSocketHandle() const  
{
return  m_sock;
}
bool Listen( int nConnectionBacklog = 5 )
{
if(listen(m_sock,nConnectionBacklog)==-1)
return false;
return true;
}
void close()
{
closesocket (m_sock);
}
static int GetLastError()
{
return WSAGetLastError();
}
};
CSockets::CSockets()
{
WSADATA wd;
WSAStartup(0x0202,&wd);
m_sock=-1;//让套接字=-1


}


CSockets::~CSockets()
{
close();
}
bool CSockets::Creates( UINT nSocketPort ,//端口
  int nSocketType ,//是TCP还是UDP
  LPCTSTR lpszSocketAddress)//创建的IP地址
{
m_sock=socket(AF_INET,nSocketType,0);
if(m_sock==-1)
return false;

if(Bind(nSocketPort,lpszSocketAddress)==false)
return false;
return true;
}




bool CSockets::Bind( UINT nSocketPort, LPCTSTR lpszSocketAddress)
{
sockaddr_in ad={AF_INET,htons(nSocketPort)};
if(lpszSocketAddress!=NULL)
ad.sin_addr.S_un.S_addr=inet_addr(lpszSocketAddress);
if( bind(m_sock,(sockaddr*)&ad,sizeof(ad))==-1)
return false;
return true;
}


bool CSockets::Accept( CSockets& rConnectedSocket,//引用的输出参数用来接收发送的socket
SOCKADDR* lpSockAddr,//连接的IP地址
int* lpSockAddrLen)//连接IP地址它的数据大小的地址
 
{
rConnectedSocket.m_sock=accept(m_sock,lpSockAddr,lpSockAddrLen);
if(rConnectedSocket.m_sock==-1)
return false;
return true;
}




int CSockets::Receive( void* lpBuf, int nBufLen, int nFlags)
{
int Count=recv(m_sock,(char*)lpBuf,nBufLen,nFlags);
return Count;
}


int CSockets::Send( const void* lpBuf, int nBufLen, int nFlags)
{
int Count=send(m_sock,(const char*)lpBuf,nBufLen,nFlags);
return Count;
}




int CSockets::SendTo( const void* lpBuf,//发送字节的大小
int nBufLen,//字节的长度
UINT nHostPort,//端口
LPCTSTR lpszHostAddress,//要发送的地址
int nFlags)
{
sockaddr_in ad={AF_INET,htons(nHostPort)};
if(lpszHostAddress!=NULL)
ad.sin_addr.S_un.S_addr=inet_addr(lpszHostAddress);
int Count=sendto(m_sock,(const char*)lpBuf,nBufLen,nFlags,(sockaddr*)&ad,sizeof(ad));
return Count;
}



bool CSockets::Connect( LPCTSTR lpszHostAddress, UINT nHostPort )
{
sockaddr_in ad={AF_INET,htons(nHostPort)};
if(lpszHostAddress!=NULL)
ad.sin_addr.S_un.S_addr=inet_addr(lpszHostAddress);
if(connect(m_sock,(sockaddr*)&ad,sizeof(ad))==-1)
return false;
return true;




}




bool CSockets::Getpeername(char* rPeerAddress, UINT& rPeerPort )
{
sockaddr_in ad={AF_INET};
int len =sizeof(ad);
if(getpeername(m_sock,(sockaddr*)&ad,&len)!=0)
return false;
strcpy(rPeerAddress,inet_ntoa(ad.sin_addr));
rPeerPort=htons(ad.sin_port);
return true;
}


bool CSockets::Getsockname(char* lpSockAddr, UINT& rSocketPort )
{
sockaddr_in ad={AF_INET};
int len=sizeof(ad);
if(getsockname(m_sock,(sockaddr*)&ad,&len)!=0)
return false;
strcpy(lpSockAddr,inet_ntoa(ad.sin_addr));
rSocketPort=htons(ad.sin_port);
return true;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值