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

📄 net_base.cpp

📁 类似QQ,MSN表情的richedit,用来测试表情控件的
💻 CPP
字号:
#include "stdafx.h"
#include "net_base.h"

net_base::net_base()
{
	client_socket = NULL;
	btcpp = false;
	netmulip = 0;
}

net_base::~net_base()
{
	netclose();
}

//创建socket
bool net_base::create(bool m_bool)
{
	btcpp = m_bool;
	if(client_socket != NULL)
		return false;

	if(btcpp)
		client_socket = socket(AF_INET, SOCK_STREAM, 0);
	else
		client_socket = socket(AF_INET, SOCK_DGRAM, 0);

	if(client_socket == INVALID_SOCKET)
		return false;

	int err;
	if(btcpp)
	{
		int optval = 1;
		err = setsockopt(client_socket, IPPROTO_TCP, TCP_NODELAY, (char*)&optval, sizeof(optval));
		if( err == SOCKET_ERROR ) 
			return false;	
	}

	int len = 32768*3;
	err = setsockopt(client_socket, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int));
	if( err == SOCKET_ERROR ) 
		return false;
	
	return true;
}

bool net_base::checkprocotol()
{
	return btcpp;
}

bool net_base::netaddgroup(ULONG mulip, USHORT mulport)
{
	int ttl = 128;

	if(client_socket == NULL)
		return false;

	if(mulip && !btcpp)
	{
		int err = setsockopt(client_socket, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ttl, sizeof(int));
		if( err == SOCKET_ERROR ) 
			return false;
			
		BOOL loopback = FALSE;
		err = setsockopt(client_socket, IPPROTO_IP, IP_MULTICAST_LOOP, (char*)&loopback, sizeof(BOOL));
		if( err == SOCKET_ERROR ) 
			return false;
						
		ip_mreq im;
		im.imr_multiaddr.S_un.S_addr = htonl(mulip);
		im.imr_interface.S_un.S_addr = INADDR_ANY;

		err = setsockopt(client_socket, IPPROTO_IP,IP_ADD_MEMBERSHIP, (char*)&im, sizeof(im));
		if( err == SOCKET_ERROR ) 
			return false;
		
		netmulip = mulip;
	}

	return bind_socket(mulport);				
}

bool net_base::netleavegroup()
{	
	if(netmulip==0  || 	btcpp)
		return false;

	ip_mreq im;  //?
	im.imr_interface.s_addr = netmulip;
	im.imr_multiaddr.s_addr = INADDR_ANY;
	
	setsockopt(client_socket, 0, IP_DROP_MEMBERSHIP, (char*)&im, sizeof(im));

	return true;
}

bool net_base::bind_socket(USHORT bindport)
{
	if(client_socket == NULL || bindport == 0)
		return false;

	SOCKADDR_IN m_clinetaddr;
	m_clinetaddr.sin_family = AF_INET;
	m_clinetaddr.sin_addr.s_addr = INADDR_ANY;   
	m_clinetaddr.sin_port = htons(bindport);

	int result = bind(client_socket,(LPSOCKADDR)&m_clinetaddr,sizeof(m_clinetaddr));
	if (result == SOCKET_ERROR)
		return false;

	return true;
}

bool net_base::connectserver(ULONG ip, USHORT port, bool m_bool)
{
	if(client_socket == NULL || !btcpp)
		return false;

	SOCKADDR_IN m_clinetaddr;
	m_clinetaddr.sin_family = AF_INET;
	m_clinetaddr.sin_addr.s_addr = ip;   
	m_clinetaddr.sin_port = htons(port);

	if(connect(client_socket,(LPSOCKADDR)&m_clinetaddr,sizeof(m_clinetaddr)) == SOCKET_ERROR)
		return false;

	if(m_bool)
	{
		unsigned long ul = 1;
		
		//设置为无阻塞通信模式(FIONBIO)
		int result = ioctlsocket(client_socket, FIONBIO, (unsigned long*)&ul);
		if(result == SOCKET_ERROR)
			return false;
	}
		
	return true;
}

ULONG net_base::senddata(char *pbuf, int length, ULONG ip, USHORT port)
{
	int result = 0;
	if(client_socket == NULL || pbuf == NULL)
		return -1;

	if(!btcpp)
	{
		SOCKADDR_IN m_clinetaddr;
		m_clinetaddr.sin_family = AF_INET;
		m_clinetaddr.sin_addr.s_addr = ip;   
		m_clinetaddr.sin_port = htons(port);

		result = sendto(client_socket, pbuf, length, 0, (sockaddr *)&m_clinetaddr, sizeof(m_clinetaddr));
	}
	else
		result = send(client_socket, pbuf, length, 0);

	return result;
}


//接收数据
ULONG net_base::recvdata(ULONG *pip, USHORT *pport)
{
	int len = 0;
	if(client_socket == NULL)
		return -1;

	if(!btcpp)//btcpp标示协议种类
	{
		SOCKADDR_IN m_clinetaddr;
		int addrlen = sizeof(m_clinetaddr);

		//If no error occurs, recvfrom returns the number of bytes received. If the 
		//connection has been gracefully closed, the return value is zero. Otherwise, 
		//a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.
		//面向无连接
		len = recvfrom(client_socket, get_data_buf, RECVDATABUFLEN, 0, (struct sockaddr FAR *)&m_clinetaddr, (int FAR *)&addrlen);

		*pip = m_clinetaddr.sin_addr.s_addr;   
		*pport = m_clinetaddr.sin_port;
	}
	else
	{  
		//面向连接
		len = recv(client_socket, get_data_buf, RECVDATABUFLEN, 0);
		*pip = 0;   
		*pport = 0;
	}

	return len;
}

bool net_base::netclose()
{
	if(client_socket != NULL)
	{
		netleavegroup();
		closesocket(client_socket);
		netmulip = 0;
	}

	client_socket = NULL;
	return true;
}

void net_base::entry()
{
	int result;

	    /* typedef struct fd_set {
        u_int fd_count;                 // The number of sockets that are set.
        SOCKET  fd_array[FD_SETSIZE];   // An array of the sockets in the set
        };fd_set*/

	FD_SET InternalReadfds;
	timeval tv = {0, 200000};

	ULONG recvip;
	USHORT recvport;

	while(1)
	{
		if(threadcheck())
			break;
		
		if(client_socket == NULL)
		{
			Sleep(200);
			continue;
		}

		FD_ZERO(&InternalReadfds);
		FD_SET(client_socket, &InternalReadfds); //?
	
		result = select(0, &InternalReadfds, NULL, NULL, &tv);
		if(result>0 )
		{
			result = recvdata(&recvip, &recvport);
			if(result>0)
				dealrecvdata(get_data_buf, result, recvip, recvport);
			else if(result == 0 && btcpp)
				netclose();
		}
	}

	threadclose();
}

⌨️ 快捷键说明

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