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();
};
#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; } }
相关文章推荐
- 基于事件驱动的前端通信框架(封装socket.io)
- .Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--使用封装的网络服务1
- 事件模型SOCKET封装
- [C++] socket - 5 [API事件对象实现线程同步]
- 自己封装的Socket组件,实现服务端多进程共享Socket对象,协同处理客户端请求
- [C++] socket - 6 [API互斥事件对象实现线程同步]
- Qt中,事件被封装成一个个对象
- .Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--使用封装的网络服务2
- 转:sock_ev——linux平台socket事件框架(socket API的封装) .
- 跨浏览器事件对象封装
- webSocket通用对象封装,心跳检测+断线重连
- JavaScript跨浏览器处理事件方法(封装成对象)
- 将Linux的信号量sem_t封装成事件对象
- 自己封装的Socket组件,实现服务端多进程共享Socket对象,协同处理客户端请求
- .Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--使用封装的网络服务3[聊天室]
- Socket对象的OnXXXX事件不被调用,怎么解决?
- 自己封装的Socket组件,实现服务端多进程共享Socket对象,协同处理客户端请求
- .Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--使用封装的网络服务4[聊天室]
- JS-DOM2级事件对象跨浏览器处理(已封装)
- 对原生js事件对象处理的封装