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

📄 net_udp.cpp

📁 实时监控
💻 CPP
字号:
#include "stdafx.h"
#include "net_udp.h"
#include "net_cmd.h"
#include "sock_init.h"	// initialize winsocket
#include "autobuf.h"
extern FILE * fppppp;
USHORT m_bind_real_port = 28000;
USHORT m_bind_vod_port = 29000;
//##ModelId=3F9A1D22012F
net_udp::net_udp(): h(NULL)
{

}

//##ModelId=3F9A1D220130
net_udp::~net_udp()
{
	destroy() ;
}

//##ModelId=3F9A1D22013A
ULONG net_udp::get_ip() const
{
	return local.ip() ;
}

//##ModelId=3F9A1D22013C
USHORT net_udp::get_port() const
{
	return local.port() ;
}
void net_udp::create_new_bind_socket(net_addr& addr, USHORT & new_port, BOOL image_type)
{
	int error = 0;
	USHORT old_port = addr.port();
    
	SOCKADDR_IN sock_bind;
	sock_bind.sin_family = AF_INET; 
	sock_bind.sin_addr.S_un.S_addr = INADDR_ANY; 

	for(int k = 0; k<1000 ; k++)
	{
        sock_bind.sin_port = htons(new_port);
        error = bind(h,(LPSOCKADDR)&sock_bind,sizeof(SOCKADDR_IN));
		new_port++;

	    if( error != SOCKET_ERROR) 
		{
			addr.set_real_port(new_port-1);
            local = addr;
			net_cmd::m_netcmdp->send_bind_cmd(old_port, addr.port(),image_type);
			break;
		}
	}
}

//##ModelId=3F9A1D220144
bool net_udp::create(net_addr& addr, BOOL image_type)
{
	int err = 0;

	local = addr;

	h = socket(AF_INET, SOCK_DGRAM, 0);
	if( INVALID_SOCKET == h )
		return false;

	int len = 32768*3;
	err = setsockopt(h, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int));
    
	err = bind(h, addr, addr.size());
	if( SOCKET_ERROR == err )
	{
		if (WSAEADDRINUSE == WSAGetLastError())  
		{
		   if(image_type) 
		       create_new_bind_socket(addr, m_bind_real_port,image_type);
	       else 
		       create_new_bind_socket(addr, m_bind_vod_port,image_type);   
		}
		else 
			return false;
	}
	//if(fppppp)
	   //fprintf(fppppp, "net_udp bind ok port: %ld \n", addr.port()) ;

	thrd_start(THREAD_PRIORITY_NORMAL) ;
   // fprintf(fppppp, "->net th %ld to bgn\n", this) ; fflush(fppppp) ;

	return true;
}

//##ModelId=3F9A1D22014D
void net_udp::destroy()
{
	DWORD  kkk ;
    //fprintf(fppppp, "net th %ld to end\n", this) ; fflush(fppppp) ;

	kkk = thrd_close(INFINITE) ;

	//fprintf(fppppp, "  net th %ld end %ld:\n", this, kkk) ; fflush(fppppp) ;

	if ( h )
	{
		closesocket(h);
		h = NULL;
	}

	local.set_ip((ULONG)0);
	local.set_real_port(0);
}

//##ModelId=3F9A1D220157
DWORD net_udp::send(byte* buf, int length, net_addr& target)
{
	int err = sendto(h, (LPCTSTR)buf, length, 0, target, target.size() );
	//fprintf(fppppp,"send cmd: %ld  to: %ld\n ",buf[4],target.ip());
	return err;
}

//##ModelId=3F9A1D22016B
DWORD net_udp::recv(byte* buf, net_addr* from /* = NULL */)
{
	net_addr fr;
	if( !from )
		from = &fr;
	
	int len = 8192;
	int fromlen = net_addr::size();
	DWORD bytes = recvfrom(h, (char*)buf, len, 0, *from, &fromlen );
	//fprintf(fppppp,"recv data length: %ld  from: %ld port: %ld\n ",bytes,from->ip(), from->port());
	return bytes;
}

//##ModelId=3F9A1D220189
void net_udp::got_something()
{
	net_addr from;
	int fromlen = from.size();
	int length = 0;
	
	length = recv(get_data_buf, &from) ;

	if (SOCKET_ERROR == length)
		return ;
	
	on_net_udp_recv(get_data_buf, length, &from);
}

//##ModelId=3F9A1D220176
void net_udp::entry()
{
	timeval  tv = {0, 200000} ;	// wait for 1s
	FD_SET   read ;

	FD_ZERO(&read) ;
	while (1)  {
		if (check_exit())
			break ;
		
		if (!h)  {
			Sleep(40) ;
			continue ;
		}
		FD_SET(h, &read) ;
		int err = ::select(0, &read, NULL, NULL, &tv) ;
		if (err > 0)  {
			got_something() ;
		}
	}
}

⌨️ 快捷键说明

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