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();
}