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