您的位置:首页 > 其它

Socket封装类(事件对象)

2018-01-09 08:34 239 查看
直接上封装类的代码:

#pragma once
class CSocketEx
{
private:
SOCKET m_hSocket;
WSAEVENT EventArray[1];
public:
CSocketEx(void);
virtual ~CSocketEx(void);

BOOL Create(UINT nSocketPort = 0,int nSocketType = SOCK_STREAM,LPCTSTR lpszSocketAddress = NULL);
BOOL Accept(CSocketEx& rConnectedSocket,LPSTR szIP = NULL,UINT* nPort = NULL);
BOOL Connect( LPCTSTR lpszHostAddress, UINT nHostPort );
BOOL Bind(UINT nSocketPort,LPCTSTR lpszSocketAddress = NULL);
BOOL Listen(int nConnectionBacklog = 5);
int Send(const void* lpBuf,int nBufLen,int nFlags = 0);
int Receive(void* lpBuf,int nBufLen,int nFlags = 0);
void Close();
};


#include "StdAfx.h"
#include "SocketEx.h"

CSocketEx::CSocketEx(void)
{
m_hSocket = INVALID_SOCKET;
EventArray[0] = WSA_INVALID_EVENT;
}

CSocketEx::~CSocketEx(void)
{
Close();
}

BOOL CSocketEx::Create( UINT nSocketPort,int nSocketType,LPCTSTR lpszSocketAddress)
{
m_hSocket = WSASocket(AF_INET,nSocketType,IPPROTO_TCP,NULL,0,WSA_FLAG_OVERLAPPED);

if(INVALID_SOCKET == m_hSocket)  return FALSE;

EventArray[0] = WSACreateEvent();

return Bind(nSocketPort,lpszSocketAddress);
}

BOOL CSocketEx::Bind( UINT nSocketPort, LPCTSTR lpszSocketAddress  )
{
sockaddr_in sa={AF_INET,htons(nSocketPort)};

if(lpszSocketAddress) sa.sin_addr.s_addr = inet_addr(lpszSocketAddress);

return !bind(m_hSocket,(sockaddr*)&sa,sizeof(sa));
}

BOOL CSocketEx::Listen(int nConnectionBacklog)
{
return !listen(m_hSocket,nConnectionBacklog);
}

BOOL CSocketEx::Accept(CSocketEx& rConnectedSocket,LPSTR szIP,UINT *nPort)
{
sockaddr_in sa ;
int len = sizeof(sa);
rConnectedSocket.m_hSocket = accept(m_hSocket,(sockaddr*)&sa,&len);

if(INVALID_SOCKET == rConnectedSocket.m_hSocket)
return FALSE;

if(szIP)
strcpy(szIP,inet_ntoa(sa.sin_addr));

if(nPort)
*nPort = htons(sa.sin_port);

return TRUE;
}

BOOL CSocketEx::Connect(LPCTSTR lpszHostAddress,UINT nHostPort)
{
sockaddr_in sa={AF_INET,htons(nHostPort)};
sa.sin_addr.s_addr = inet_addr(lpszHostAddress);

if(connect(m_hSocket,(SOCKADDR*)&sa,sizeof(sa)) == SOCKET_ERROR)
return false;
else
{
WSAEventSelect(m_hSocket,EventArray[0],FD_READ);
return true;
}
}

int CSocketEx::Receive(void* lpBuf,int nBufLen,int nFlags)
{
DWORD dRet = WSAWaitForMultipleEvents(1,EventArray,TRUE,2000,FALSE);

if(dRet == WAIT_TIMEOUT)
{
return -2;
}

WSAResetEvent(EventArray[0]);

return recv(m_hSocket,(LPSTR)lpBuf,nBufLen,nFlags);
}

int CSocketEx::Send(const void* lpBuf,int nBufLen,int nFlags)
{
return send(m_hSocket,(LPCSTR)lpBuf,nBufLen,nFlags);
}

void CSocketEx::Close()
{
if (m_hSocket != INVALID_SOCKET)
{
closesocket(m_hSocket);
m_hSocket = INVALID_SOCKET;
}

if (EventArray[0] != WSA_INVALID_EVENT)
{
WSACloseEvent(EventArray[0]);
EventArray[0] = WSA_INVALID_EVENT;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: