winsock2套接字封装使用

Socket.h

#ifndef _CSOKET_H_
#define _CSOKET_H_
#include <winsock2.h>
#include <windows.h>

class CSoCket
{
protected:
	SOCKET m_hSocket;
public:
	CSoCket();
	virtual ~CSoCket();
	BOOL Listen(int n = 5);
	BOOL Accept(CSoCket& rConnectedSocket,LPSTR szIP = NULL,UINT* nPort = NULL);
	BOOL Connect(LPCTSTR lpszHostAddress,UINT nHostPort);
	int Send(const void* lpBuf, int nBufLen, int nFlags = 0);//发送数据
	BOOL GetPeerName(char* rSocketAddress, UINT& rSocketPort);//得到名字PEER版本
	BOOL GetSockName(char* rSocketAddress, UINT& rSocketPort);//得到名字SOCK版本
	BOOL Create(UINT nSocketPort = 0,int nSocketType = SOCK_STREAM, LPCTSTR lpszSocketAddress = NULL);//创建
	int SendTo(const void* lpBuf,int nBuflen,UINT nHostPort,LPCTSTR lpszHostAddress = (LPCTSTR)0,int nFlags = 0);//发送给指定目标
	int ReceiveFrom(void* lpBuf, int nBufLen, char* rSocketAddress, UINT& rSocketPort,int nFlags = 0);//接收,阻塞模式
	int Receive(void* lpBug, int nBufLen, int nFlags = 0);
	void Close();
};
#endif // !

Socket.cpp

#define _CRT_SECURE_NO_WARNINGS
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include "Socket.h"
#pragma comment(lib,"ws2_32.lib")


CSoCket::CSoCket()
{
	WSAData wd;
	WSAStartup(0x0202,&wd);
	m_hSocket = INVALID_SOCKET;
}

CSoCket::~CSoCket()
{
	Close();
}

BOOL CSoCket::Listen(int n)
{
	return !listen(m_hSocket,n);
}

BOOL CSoCket::Accept(CSoCket & rConnectedSocket, LPSTR szIP, UINT * nPort)
{
	sockaddr_in sa = {AF_INET};
	int nLen = sizeof(sa);
	rConnectedSocket.m_hSocket = accept(m_hSocket,(sockaddr*)&sa,&nLen);
	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 CSoCket::Connect(LPCTSTR lpszHostAddress, UINT nHostPort)
{
	sockaddr_in sa = {AF_INET,htons(nHostPort)};
	sa.sin_addr.S_un.S_addr = inet_addr(lpszHostAddress);//地址
	return !connect(m_hSocket, (sockaddr*)&sa, sizeof(sa));
}

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

BOOL CSoCket::GetPeerName(char * rSocketAddress, UINT & rSocketPort)
{
	sockaddr_in name = { AF_INET };
	int nLen = sizeof(name);
	if (getpeername(m_hSocket, (sockaddr*)&name, &nLen) < 0)
		return FALSE;
	rSocketPort = htons(name.sin_port);
	strcpy(rSocketAddress, inet_ntoa(name.sin_addr));
	return TRUE;
}

BOOL CSoCket::GetSockName(char * rSocketAddress, UINT & rSocketPort)
{
	sockaddr_in name = {AF_INET};
	int nLen = sizeof(name);
	if (getsockname(m_hSocket, (sockaddr*)&name, &nLen) < 0)
		return FALSE;
	rSocketPort = htons(name.sin_port);
	strcpy(rSocketAddress, inet_ntoa(name.sin_addr));
	return TRUE;
}

BOOL CSoCket::Create(UINT nSocketPort, int nSocketType, LPCTSTR lpszSocketAddress)
{
	m_hSocket = socket(AF_INET, nSocketType, 0);
	if (m_hSocket == INVALID_SOCKET)
		return FALSE;
	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));;
}

int CSoCket::SendTo(const void * lpBuf, int nBuflen, UINT nHostPort, LPCTSTR lpszHostAddress, int nFlags)
{
	sockaddr_in sa = { AF_INET,htons(nHostPort) };
		if (lpszHostAddress)
			sa.sin_addr.s_addr = inet_addr(lpszHostAddress);

	BOOL b = sendto(m_hSocket,(char*)lpBuf,nBuflen,0,(sockaddr*)&sa,sizeof(sa));
	return 0;
}

int CSoCket::ReceiveFrom(void* lpBuf, int nBufLen, char* rSocketAddress, UINT& rSocketPort, int nFlags)
{
	sockaddr_in sa = { AF_INET };
	int nlen = sizeof(sa);
	int nRet = recvfrom(m_hSocket, (char*)lpBuf, nBufLen,0, (sockaddr*)&sa, &nlen);
	if (nRet > 0)
	{
		rSocketPort = htons(sa.sin_port);
		strcpy(rSocketAddress,inet_ntoa(sa.sin_addr));
	}
	return nRet;
}

int CSoCket::Receive(void * lpBug, int nBufLen, int nFlags)
{
	return recv(m_hSocket,(LPTSTR)lpBug,nBufLen,nFlags);
}

void CSoCket::Close()
{
	closesocket(m_hSocket);
	m_hSocket = INVALID_SOCKET;
}

使用方法

	if (!m_Sock.Create(PORT))
	{
		std::cout << "创建失败" << std::endl;
		return;
	}
	m_Sock.Listen();
	char sIP[20] = {};
	UINT nPort;
	while (m_Sock.Accept(*sockea, sIP, &nPort))
	{
		//这里就可以干活了发送和接收
	}



猜你喜欢

转载自blog.csdn.net/qq_18604483/article/details/78194171