socket网络编程CSocket的简单封装

xiaoxiao2021-02-28  13

MyCSocket.h #pragma once #include<WinSock2.h> #define _WINSOCK_DEPRECATED_NO_WARNINGS #define _CRT_SECURE_NO_WARNINGS class MyCSocket { protected: SOCKET m_Socket; public: MyCSocket(); ~MyCSocket(); BOOL Create(UINT nSocketPort = 0, int nSocketType = SOCK_STREAM, LPCTSTR lpszSocketAddress = NULL);//创建Socket BOOL Bind(UINT nSocketPort, LPCTSTR lpszSocketAddress = NULL);//绑定 BOOL Listen(int nConnectionBacklog = 5);//TCP监听 BOOL Connect(LPCTSTR lpszHostAddress,UINT nHostPort);//TCP客户端需要连接 BOOL Accept(MyCSocket& rConnectedSocket, LPSTR lpSockAddr = NULL, UINT *nPort = NULL);//TCP服务端需要接受连接 int Send(const void* lpBuf,int nBufLen,int nFlags = 0);//TCP发送消息 int SendTo(const void * lpBuff, int nBuffLen, UINT nSendPort, LPCTSTR lpszSendIPAddress = NULL, int nFlags = 0);//UDP发送消息 int Receive(void* lpBuf,int nBufLen,int nFlags = 0);//TCP接收消息 int ReceiveFrom(void* lpBuff, int nBuffLen, char* rRecvIPAddress, UINT& nRecvPort,int nFlags=0);//UDP接收消息 BOOL GetSockName(char* rSocketAddress, UINT& rSocketPort); BOOL GetPeerName(char* rPeerAddress, UINT& rPeerPort); void close(); };

MyCSocket.cpp #include "MyCSocket.h" #pragma comment(lib,"ws2_32.lib") /***************************************************************** 函数名: MyCSocket() 参数: 无 返回值: 无 功能: 启动socket,默认使用版本2.2 调用函数: WSAStartup() ******************************************************************/ MyCSocket::MyCSocket() { WSAData wsaData; WSAStartup(0x0202, &wsaData); } /***************************************************************** 函数名: ~MyCSocket() 参数: 无 返回值: 无 功能: 调用函数: close() ******************************************************************/ MyCSocket::~MyCSocket() { close(); } /***************************************************************** 函数名: Create() 参数: nSocketPort nSocketType lpszSocketAddress 返回值: BOOL 功能: 创建socket,默认协议使用TCP 调用函数: socket() ******************************************************************/ BOOL MyCSocket::Create(UINT nSocketPort, int nSocketType, LPCTSTR lpszSocketAddress) { //创建socket m_Socket = socket(AF_INET, nSocketType, 0); if (INVALID_SOCKET == m_Socket) return FALSE; return TRUE; } /***************************************************************** 函数名: Bind() 参数: nSocketPort lpszSocketAddress 返回值: BOOL 功能: 初始化协议簇、绑定socket 调用函数: bind() ******************************************************************/ BOOL MyCSocket::Bind(UINT nSocketPort, LPCTSTR lpszSocketAddress) { //初始化sockaddr_in sockaddr_in MySockAddr = { AF_INET,htons(nSocketPort) }; if (lpszSocketAddress) MySockAddr.sin_addr.S_un.S_addr = inet_addr(lpszSocketAddress); else MySockAddr.sin_addr.S_un.S_addr = INADDR_ANY; //绑定bind return !(bind(m_Socket, (sockaddr*)&MySockAddr, sizeof(MySockAddr))); } /***************************************************************** 函数名: Listen() 参数: nConnectionBacklog 返回值: BOOL 功能: 监听连接,默认个数为5 调用函数: listen() ******************************************************************/ BOOL MyCSocket::Listen(int nConnectionBacklog) { return !(listen(m_Socket, nConnectionBacklog)); } /***************************************************************** 函数名: Connect() 参数: lpszHostAddress nHostPort 返回值: BOOL 功能: 服务器需要接受连接,而客户端需要连接,该函数为客户端使用 调用函数: connect() ******************************************************************/ BOOL MyCSocket::Connect(LPCTSTR lpszHostAddress, UINT nHostPort) { sockaddr_in sockAddr = {}; sockAddr.sin_family = AF_INET; sockAddr.sin_addr.S_un.S_addr = inet_addr(lpszHostAddress); sockAddr.sin_port = htons(nHostPort); return !connect(m_Socket, (sockaddr*)&sockAddr, sizeof(sockAddr)); } /***************************************************************** 函数名: Accept() 参数: rConnectedSocket lpSockAddr nPort 返回值: BOOL 功能: 服务器需要接受连接,而客户端需要连接,该函数为服务器使用 调用函数: accept() ******************************************************************/ BOOL MyCSocket::Accept(MyCSocket & rConnectedSocket, LPSTR lpSockAddr, UINT *nPort) { sockaddr_in AcceptSockAddr = { AF_INET }; int AcceptSockAddrLen = sizeof(AcceptSockAddr); rConnectedSocket.m_Socket = accept(this->m_Socket, (sockaddr*)&AcceptSockAddr, &AcceptSockAddrLen); if (INVALID_SOCKET == rConnectedSocket.m_Socket) return FALSE; if (lpSockAddr) strcpy(lpSockAddr, inet_ntoa(AcceptSockAddr.sin_addr)); if (nPort) *nPort = htons(AcceptSockAddr.sin_port); return TRUE; } /***************************************************************** 函数名: Send() 参数: lpBuf nBufLen nFlags = 0 返回值: int 功能: TCP发送消息 调用函数: send() ******************************************************************/ int MyCSocket::Send(const void * lpBuf, int nBufLen, int nFlags) { return send(m_Socket, (LPCSTR)lpBuf, nBufLen, nFlags); } /***************************************************************** 函数名: SendTo() 参数: lpBuf nBufLen nSendPort lpszSendIPAddress nFlags = 0 返回值: int 功能: UDP发送消息 调用函数: sendto() ******************************************************************/ int MyCSocket::SendTo(const void * lpBuff, int nBuffLen, UINT nSendPort, LPCTSTR lpszSendIPAddress, int nFlags) { sockaddr_in SendToSockAddr = { AF_INET,htons(nSendPort) }; SendToSockAddr.sin_addr.S_un.S_addr = inet_addr(lpszSendIPAddress); return sendto(m_Socket, (const char*)lpBuff, nBuffLen, nFlags, (sockaddr*)&SendToSockAddr, sizeof(SendToSockAddr)); } /***************************************************************** 函数名: Receive() 参数: lpBuf nBufLen nFlags = 0 返回值: int 功能: TCP接收消息 调用函数: recv() ******************************************************************/ int MyCSocket::Receive(void * lpBuf, int nBufLen, int nFlags) { return recv(m_Socket, (LPSTR)lpBuf, nBufLen, nFlags); } /***************************************************************** 函数名: ReceiveFrom() 参数: lpBuf nBufLen rRecvIPAddress nRecvPort nFlags = 0 返回值: int 功能: UDP接收消息 调用函数: recvfrom() ******************************************************************/ int MyCSocket::ReceiveFrom(void * lpBuff, int nBuffLen, char * rRecvIPAddress, UINT & nRecvPort, int nFlags) { sockaddr_in RecvFromSockAddr = { AF_INET }; int nSockAddrLen = sizeof(RecvFromSockAddr); int nDataLen = recvfrom(m_Socket, (char*)lpBuff, nBuffLen, nFlags, (sockaddr*)&RecvFromSockAddr, &nSockAddrLen); if (nDataLen > 0) { strcpy(rRecvIPAddress, inet_ntoa(RecvFromSockAddr.sin_addr)); nRecvPort = htons(RecvFromSockAddr.sin_port); } return 0; } /***************************************************************** 函数名: Close() 参数: 无 返回值: void 功能: 关闭socket 调用函数: closesocket() ******************************************************************/ void MyCSocket::close() { closesocket(m_Socket); WSACleanup(); }
转载请注明原文地址: https://www.6miu.com/read-2800259.html

最新回复(0)