📄 net_query.cpp
字号:
#include "stdafx.h"
#include "net.h"
#include "net_query.h"
#include "../NetDef.h"
extern FILE *fppppp;
extern int start_port;
extern int unused_port();
extern BOOL port_type[MAX_PORT];
#define CMD_OF(x) ((x)[10])
#define DATA_OF(x) ((x)+11)
net_query::net_query()
{
connect_socket = NULL;
bind_port = 0;
cmdcb = NULL;
}
net_query::~net_query()
{
destroy();
}
bool net_query::create(CMD_CALLEE cb)
{
connect_socket = socket(AF_INET, SOCK_DGRAM, 0);
if( INVALID_SOCKET == connect_socket )
return false;
BOOL fBroadcast = TRUE;
setsockopt ( connect_socket,SOL_SOCKET,SO_BROADCAST,(CHAR *)&fBroadcast,sizeof ( BOOL ));
int len = 640*3;
int err = setsockopt(connect_socket, SOL_SOCKET, SO_RCVBUF, (char*)&len, sizeof(int));
if(!bind_socket())
return false;
thrd_start(THREAD_PRIORITY_NORMAL) ;
cmdcb = cb;
return true;
}
bool net_query::bind_socket()
{
bind_port = unused_port();
if(bind_port==-1)
{
AfxMessageBox("端口绑定失败,请重启客户端");
return FALSE;
}
SOCKADDR_IN m_sockserveraddr;
m_sockserveraddr.sin_family = AF_INET;
m_sockserveraddr.sin_addr.s_addr = INADDR_ANY;
m_sockserveraddr.sin_port = htons(bind_port);
int result = bind(connect_socket,(LPSOCKADDR)&m_sockserveraddr,sizeof(m_sockserveraddr));
if (result == SOCKET_ERROR)
{
if(WSAGetLastError() == WSAEADDRINUSE )
{
while(1)
{
if(bind_socket())
break;
}
}
else
return false;
}
return true;
}
void net_query::clossock()
{
if(connect_socket)
{
thrd_terminate_close();
closesocket(connect_socket);
connect_socket = NULL;
}
}
void net_query::destroy()
{
if(connect_socket)
{
thrd_close(1000);
closesocket(connect_socket);
connect_socket = NULL;
}
}
bool net_query::got_something()
{
int err =0;
if(!connect_socket)
return TRUE;
err = recv(connect_socket, (char*)getdatabuf, 8192, 0);
if( err == SOCKET_ERROR || !err)
{
clossock();
return false;
}
if( CMD_OF(getdatabuf) == NETCOM_SEARCH_DVRTPC )
{
POST_NOTIFY(cmdcb, NTM_CMD_DVR, (WPARAM)DATA_OF(getdatabuf), NULL );
}
return TRUE;
}
void net_query::send_something(char * buf, int length)
{
if(!connect_socket)
return;
SOCKADDR_IN saUdpServ;
saUdpServ.sin_family = AF_INET;
saUdpServ.sin_addr.s_addr = htonl ( INADDR_BROADCAST );
saUdpServ.sin_port = htons (1234);//发送用的端口,可以根据需要更改
sendto ( connect_socket,buf, length,0,(SOCKADDR *) &saUdpServ,sizeof ( SOCKADDR_IN ));
}
void net_query::entry()
{
FD_SET a;
int err = 0;
timeval tv = {0,200000};
while(1)
{
if( check_exit() )
break;
if( !connect_socket )
Sleep(40);
FD_ZERO(&a);
FD_SET(connect_socket, &a);
err = select(0, &a, NULL, NULL, &tv);
if( err > 0 )
{
if(!got_something())
return;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -