⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hsocket.cpp

📁 进行UDP的有效传输
💻 CPP
字号:
#include "stdafx.h"
#include ".\hsocket.h"

CHsocket::CHsocket(CHsocket& hsocket) : m_socket(hsocket.m_socket)
{

}

CHsocket::CHsocket(SOCKET socket) : m_socket(socket)
{

}

CHsocket::CHsocket()
{
	m_socket = INVALID_SOCKET;
}

CHsocket::~CHsocket()
{
}

bool CHsocket::StartSock()
{
	WSADATA wsaData;
	int ret = WSAStartup(MAKEWORD(2, 2), &wsaData);
	if(ret == SOCKET_ERROR)
	{
	//	cout << "网络初化失败" << endl;	
		return false;
	}

	return true;
}

bool CHsocket::hsocket(unsigned int port, int type, const char* address)
{
	m_socket = socket(AF_INET, type, 0);
	if(m_socket == SOCKET_ERROR)
	{
	//	cout << "socket error" << endl;
		return false;
	}

	if(port == 0)// if nPort is zero, only create a socket, not bind
		return true;

	makesendsockaddr(address, port);

	int ret = bind(m_socket, (struct sockaddr*)&m_sendsockaddr, sizeof(m_sendsockaddr));
	if(ret == SOCKET_ERROR)
	{
	//	cout << "bind error" << endl;
		return false;
	}

	return true;
}

int CHsocket::hconnect(char* address, unsigned int port)
{
	struct sockaddr_in sockaddr;
	memset(&sockaddr, 0, sizeof(sockaddr));
	sockaddr.sin_addr.s_addr	= inet_addr(address);
	sockaddr.sin_family		= AF_INET;
	sockaddr.sin_port			= htons(port);
	return connect(m_socket, (struct sockaddr*)&sockaddr, sizeof(sockaddr));
}

int CHsocket::hlisten(int backlog)
{
	return listen(m_socket, backlog);
}

SOCKET CHsocket::haccept()
{
	struct sockaddr_in sockaddr;
	int	addrlen = sizeof(sockaddr);

	memset(&sockaddr, 0, sizeof(sockaddr));

	return accept(m_socket, (struct sockaddr*)&sockaddr, &addrlen);
}

int CHsocket:: hsend(const char* buf, int len)
{
	return send(m_socket, buf, len, 0);
}

int CHsocket::hrecv(char* buf, int len)
{
	return recv(m_socket, buf, len, 0);
}

int CHsocket::hsendto(const char* buf, int len, const sockaddr* to)
{
	return sendto(m_socket, buf, len, 0, to, sizeof(m_sockaddr));
}

int CHsocket::hsendto(const char* buf, int len)
{
	return sendto(m_socket, buf, len, 0, (struct sockaddr*)&m_sendsockaddr, sizeof(m_sendsockaddr));
}

int CHsocket::hrecvfrom(char* buf, int len, sockaddr* from)
{
	int sockaddrlen = sizeof(m_sockaddr);
	
	return recvfrom(m_socket, buf, len, 0, from, &sockaddrlen);
}

int CHsocket::hrecvfrom(char* buf, int len)
{
	int sockaddrlen = sizeof(m_sockaddr);

	return recvfrom(m_socket, buf, len, 0, (struct sockaddr*)&m_sockaddr, &sockaddrlen);
}

int CHsocket::hclosesocket()
{
	return closesocket(m_socket);
}

int CHsocket::CleanSock()
{
	return WSACleanup();
}

SOCKET CHsocket::operator *()
{
	return m_socket; 
}

CHsocket& CHsocket::operator =(CHsocket& hsocket)
{
	if(this == &hsocket)
		return *this;

	m_socket = hsocket.m_socket;
	memcpy(&m_sockaddr, &hsocket.m_sockaddr, sizeof(m_sockaddr));
	memcpy(&m_sendsockaddr, &hsocket.m_sendsockaddr, sizeof(m_sendsockaddr));
	m_straddr = hsocket.m_straddr;
	return *this;
}

void CHsocket::makesendsockaddr(const char* ipaddr, unsigned int port, short family, const char* sin_zero)
{
	memset(&m_sendsockaddr, 0, sizeof(m_sendsockaddr));

	m_sendsockaddr.sin_addr.s_addr	= (ipaddr == NULL) ? htonl(INADDR_ANY) : inet_addr(ipaddr);
	m_sendsockaddr.sin_family		= family;
	m_sendsockaddr.sin_port			= htons(port);
}

const char* CHsocket::getsockaddr(bool brecvsock)
{
	if(brecvsock)
		m_straddr = inet_ntoa(m_sockaddr.sin_addr);
	else
		m_straddr = inet_ntoa(m_sendsockaddr.sin_addr);

	return m_straddr.data();
}

unsigned int CHsocket::getsockport(bool brecvsock)
{
	if(brecvsock)
		return ntohs(m_sockaddr.sin_port);

	return ntohs(m_sendsockaddr.sin_port);
}

const char* CHsocket::getremoteaddr()
{
	struct sockaddr_in sockaddr;
	int nlen = sizeof(sockaddr);

	memset(&sockaddr, 0, sizeof(sockaddr));

	getpeername(m_socket, (struct sockaddr*)&sockaddr, &nlen);

	m_straddr = inet_ntoa(sockaddr.sin_addr);

	return m_straddr.data();
}

const char* CHsocket::getlocaladdr()
{
	int ret;
	struct sockaddr_in sockaddr;
	int nlen = sizeof(sockaddr);

	memset(&sockaddr, 0, sizeof(sockaddr));

	ret = getsockname(m_socket, (struct sockaddr*)&sockaddr, &nlen);
	if(ret == SOCKET_ERROR)
	{
		struct hostent* phost;
		char szname[128];
		gethostname(szname, sizeof(szname));
		phost = gethostbyname(szname);

		m_straddr = inet_ntoa(*(in_addr*)phost->h_addr_list[0]);
	}
	else
	{
		m_straddr = inet_ntoa(sockaddr.sin_addr);
	}

	return m_straddr.data();
}

int CHsocket::getremoteport()
{
	struct sockaddr_in sockaddr;
	int nlen = sizeof(sockaddr);

	memset(&sockaddr, 0, sizeof(sockaddr));

	getpeername(m_socket, (struct sockaddr*)&sockaddr, &nlen);

	return ntohs(sockaddr.sin_port);
}

int CHsocket::getlocalport()
{
	struct sockaddr_in sockaddr;
	int nlen = sizeof(sockaddr);

	memset(&sockaddr, 0, sizeof(sockaddr));

	getsockname(m_socket, (struct sockaddr*)&sockaddr, &nlen);
	
	return ntohs(sockaddr.sin_port);	
}

void CHsocket::setsocket(SOCKET socket)
{
	m_socket = socket;
}

void CHsocket::setsocket(CHsocket& hsocket)
{
	m_socket = *hsocket;
}

SOCKET CHsocket::getsocket() const
{
	return m_socket;
}

bool CHsocket::islocalip(const char* ip)
{
	string strip(ip);
	if((int)strip.find("192.168") == 0)
		return true;

	return false;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -