socket网络编程/CSocket的简单封装


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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值