📄 net_udp.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 + -