net_lib.cpp
来自「网络泡泡被.net管理」· C++ 代码 · 共 783 行 · 第 1/2 页
CPP
783 行
// net_lib.cpp: implementation of the net_lib class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "net_lib.h"
#include "net.h"
#include "tcp.h"
#include "udp.h"
#include "log.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
LOG* g_ptr_net_lib_log = NULL;
void Sys_Log(const char* strLevel, const char *format,...)
{
va_list args;
va_start(args, format);
char buf[256];
VSNPRINTF(buf,255,format,args);
if(g_ptr_net_lib_log)
g_ptr_net_lib_log->ADD_Log(strLevel, buf);
else
printf("%s\r\n",buf);
/* write to file */
va_end(args);
}
unsigned long Sys_GetTime()
{
#ifdef WIN32
return GetTickCount();
#else
/* linux */
timeval tv;
gettimeofday(&tv, NULL);
return (tv.tv_sec*1000+tv.tv_usec/1000);
#endif
}
unsigned long Sys_GetSec()
{
return time(NULL);
}
void Sys_Sleep(int ms)
{
#ifdef WIN32
Sleep(ms);
#else
/* linux */
usleep(ms*1000);
#endif
}
void Sys_CreateConsole(int width, int height)
{
#ifdef WIN32
HANDLE hStdOut;
AllocConsole();
SetConsoleTitle("Debug Window");
hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
COORD co = {width , height};
SetConsoleScreenBufferSize(hStdOut, co);
freopen("CONOUT$","w+t",stdout);
freopen("CONIN$","r+t",stdin);
#endif
}
bool Net_Startup(int VersionHigh,int VersionLow)
{
#ifdef WIN32
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(VersionHigh,VersionLow);
err=WSAStartup(wVersionRequested, &wsaData);
/* startup failed */
if (err!=0)
{
Sys_Log("net_lib_log", "WSAStartup Error");
WSACleanup();
return false;
}
/* version error */
if (LOBYTE(wsaData.wVersion)!= VersionLow ||
HIBYTE(wsaData.wVersion)!= VersionHigh )
{
Sys_Log("net_lib_log", "WSAStartup Version Error");
WSACleanup();
return false;
}
//Sys_Log("WSAStartup OK");
#endif
return true;
}
bool Net_Cleanup()
{
#ifdef WIN32
WSACleanup();
#endif
return true;
}
bool NET_CanRead(SOCKET socket)
{
fd_set readfds;
timeval timeout;
timeout.tv_sec=0;
timeout.tv_usec=0;
FD_ZERO(&readfds);
FD_SET(socket,&readfds);
int ret = select(FD_SETSIZE,&readfds,NULL,NULL,&timeout);
if(ret > 0 && FD_ISSET(socket,&readfds))
return true;
else
return false;
}
bool NET_CanWrite(SOCKET socket)
{
fd_set writefds;
timeval timeout;
timeout.tv_sec=0;
timeout.tv_usec=0;
FD_ZERO(&writefds);
FD_SET(socket,&writefds);
int ret = select(FD_SETSIZE,NULL,&writefds,NULL,&timeout);
if(ret > 0 && FD_ISSET(socket,&writefds))
return true;
else
return false;
}
bool NET_HasExcept(SOCKET socket)
{
fd_set exceptfds;
timeval timeout;
timeout.tv_sec=0;
timeout.tv_usec=0;
FD_ZERO(&exceptfds);
FD_SET(socket,&exceptfds);
int ret = select(FD_SETSIZE,NULL,NULL,&exceptfds,&timeout);
if(ret > 0 && FD_ISSET(socket,&exceptfds))
return true;
else
return false;
}
bool NET_WaitForRead(SOCKET socket, long time_out_sec)
{
fd_set readfds;
timeval timeout;
timeout.tv_sec=time_out_sec;
timeout.tv_usec=0;
FD_ZERO(&readfds);
FD_SET(socket,&readfds);
int ret = select(FD_SETSIZE,&readfds,NULL,NULL,&timeout);
if(ret > 0 && FD_ISSET(socket,&readfds))
return true;
else
return false;
}
bool NET_WaitForWrite(SOCKET socket, long time_out_sec)
{
fd_set writefds;
timeval timeout;
timeout.tv_sec=time_out_sec;
timeout.tv_usec=0;
FD_ZERO(&writefds);
FD_SET(socket,&writefds);
int ret = select(FD_SETSIZE,NULL,&writefds,NULL,&timeout);
if(ret > 0 && FD_ISSET(socket,&writefds))
return true;
else
return false;
}
NET_Packet* NET_CreatePacket(int size)
{
return new NET_Packet(size);
}
bool NET_SetSendBufferSize(SOCKET socket, int len)
{
int ret;
ret = setsockopt(socket,SOL_SOCKET,SO_SNDBUF,(char *)&len,sizeof(len));
if (ret == SOCKET_ERROR) return false;
return true;
}
bool NET_SetRecvBufferSize(SOCKET socket, int len)
{
int ret;
ret = setsockopt(socket,SOL_SOCKET,SO_RCVBUF,(char *)&len,sizeof(len));
if (ret == SOCKET_ERROR) return false;
return true;
}
unsigned long NET_GetLocalIP()
{
char szHostName[128];
HOSTENT *lpHost=NULL;
struct sockaddr_in sock;
gethostname(szHostName, sizeof(szHostName));
lpHost = gethostbyname(szHostName);
if (lpHost != NULL)
{
for(int i=0; lpHost->h_addr_list[i] != NULL ;i++)
{
memcpy(&(sock.sin_addr), lpHost->h_addr_list[i], lpHost->h_length);
if (i == 0)
{
return sock.sin_addr.S_un.S_addr;
}
else
if (i == 1)
{
return sock.sin_addr.S_un.S_addr;
//SetDlgItemText(IDC_IPADDRESS2, inet_ntoa(sock.sin_addr));
}
}
}
return 0;
}
/*
* get local address
*/
bool NET_GetLocalAddr(SOCKET socket, char *addr, short *port, unsigned long *ip)
{
SOCKADDR_IN addrLocal;
socklen_t len = sizeof(addrLocal);
if(getsockname(socket,(SOCKADDR*)&addrLocal,&len)==SOCKET_ERROR)
return false;
char *tmp = inet_ntoa(addrLocal.sin_addr);
if(!tmp)
return false;
if(addr)
strcpy(addr,tmp);
if(port)
*port = ntohs(addrLocal.sin_port);
if(ip)
*ip = addrLocal.sin_addr.s_addr;
return true;
}
/*
* get remote address
*/
bool NET_GetRemoteAddr(SOCKET socket, char *addr, short *port,unsigned long *ip)
{
sockaddr_in addrRemote;
int len = sizeof(addrRemote);
if(getpeername(socket,(sockaddr *)&addrRemote,(socklen_t *)&len)==SOCKET_ERROR)
return false;
char *tmp = inet_ntoa(addrRemote.sin_addr);
if(!tmp)
return false;
if(addr)
strcpy(addr,tmp);
if(port)
*port = ntohs(addrRemote.sin_port);
if(ip)
*ip = addrRemote.sin_addr.s_addr;
return true;
}
bool NET_SetReuseAddr(SOCKET socket, bool reuse)
{
#ifndef WIN32
/* only useful in linux */
int opt = 0;
unsigned int len = sizeof(opt);
if(reuse) opt = 1;
if(setsockopt(socket,SOL_SOCKET,SO_REUSEADDR,
(const void*)&opt,len)==SOCKET_ERROR)
{
return false;
}
else
{
return true;
}
#endif
return true;
}
/*
//DWORD thread_UDP_transfers( LPVOID lpParam )
THREAD_FUNC(thread_UDP_transfers)
{
if(lpParam==NULL)
return 0;
UDP_Socket* ptr_socket = (UDP_Socket*)lpParam;
// ptr_socket->ThreadInit();
NET_Packet* ptr_recv_packet = new NET_Packet;
NET_Packet* ptr_send_packet = NULL;
time_t time_ref = Sys_GetTime();
while(ptr_socket->m_wait_thread_end==false)
{
time_t tm = Sys_GetTime();
//send request packet
if(ptr_send_packet==NULL)
{
ptr_send_packet = ptr_socket->PopSendPacket();
}
if(ptr_send_packet && ptr_socket->CanWrite())
{
ptr_send_packet->send(ptr_socket);
delete(ptr_send_packet);
ptr_send_packet = NULL;
}
//recv packet
if(ptr_socket->CanRead() && ptr_recv_packet->recv(ptr_socket)>0)
{
if(ptr_socket->PushRecvPacket(ptr_recv_packet, tm))
ptr_recv_packet = new NET_Packet;
}
//连线检测
if(tm - time_ref>1000)
{
ptr_socket->CheckConnect(tm);
time_ref = tm;
}
Sys_Sleep(10);
}
//exit thread
if(ptr_recv_packet)
delete(ptr_recv_packet);
if(ptr_send_packet)
delete(ptr_send_packet);
ptr_socket->m_wait_thread_end = false;
ptr_socket->ThreadEnd();
return 0;
}
*/
THREAD_FUNC(thread_UDP_send)
{
if(lpParam==NULL)
return 0;
THREAD_PARAM_DATA* pTPD = (THREAD_PARAM_DATA*)lpParam;
pTPD->Lock();
pTPD->Lock_Runing();
UDP_Socket* ptr_socket = (UDP_Socket*)pTPD->ptr_arg;
pTPD->Unlock();
if(ptr_socket==NULL)
{
pTPD->Unlock_Runing();
THREAD_END(pTPD);
return 0;
}
NET_Packet* ptr_send_packet = NULL;
while(pTPD->command!=THREAD_POOL_CMD_SHUTDOWN)
{
//send request packet
if(ptr_send_packet==NULL)
{
ptr_send_packet = ptr_socket->PopSendPacket();
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?