📄 socket.cpp.svn-base
字号:
bool Socket::SSLNegotiate()
{
return false;
}
bool Socket::IsSSL()
{
return m_b_enable_ssl;
}
void Socket::EnableSSL(bool x)
{
m_b_enable_ssl = x;
}
bool Socket::IsSSLNegotiate()
{
return m_b_ssl;
}
void Socket::SetSSLNegotiate(bool x)
{
m_b_ssl = x;
}
bool Socket::IsSSLServer()
{
return m_b_ssl_server;
}
void Socket::SetSSLServer(bool x)
{
m_b_ssl_server = x;
}
void Socket::OnSSLConnectFailed()
{
}
void Socket::OnSSLAcceptFailed()
{
}
#endif // HAVE_OPENSSL
#ifdef ENABLE_POOL
void Socket::CopyConnection(Socket *sock)
{
Attach( sock -> GetSocket() );
#ifdef ENABLE_IPV6
SetIpv6( sock -> IsIpv6() );
#endif
SetSocketType( sock -> GetSocketType() );
SetSocketProtocol( sock -> GetSocketProtocol() );
SetClientRemoteAddress( *sock -> GetClientRemoteAddress() );
SetRemoteAddress( *sock -> GetRemoteSocketAddress() );
}
void Socket::SetIsClient()
{
m_bClient = true;
}
void Socket::SetSocketType(int x)
{
m_socket_type = x;
}
int Socket::GetSocketType()
{
return m_socket_type;
}
void Socket::SetSocketProtocol(const std::string& x)
{
m_socket_protocol = x;
}
const std::string& Socket::GetSocketProtocol()
{
return m_socket_protocol;
}
void Socket::SetRetain()
{
if (m_bClient) m_bRetain = true;
}
bool Socket::Retain()
{
return m_bRetain;
}
#endif // ENABLE_POOL
#ifdef ENABLE_SOCKS4
void Socket::OnSocks4Connect()
{
Handler().LogError(this, "OnSocks4Connect", 0, "Use with TcpSocket only");
}
void Socket::OnSocks4ConnectFailed()
{
Handler().LogError(this, "OnSocks4ConnectFailed", 0, "Use with TcpSocket only");
}
bool Socket::OnSocks4Read()
{
Handler().LogError(this, "OnSocks4Read", 0, "Use with TcpSocket only");
return true;
}
void Socket::SetSocks4Host(const std::string& host)
{
Utility::u2ip(host, m_socks4_host);
}
bool Socket::Socks4()
{
return m_bSocks4;
}
void Socket::SetSocks4(bool x)
{
m_bSocks4 = x;
}
void Socket::SetSocks4Host(ipaddr_t a)
{
m_socks4_host = a;
}
void Socket::SetSocks4Port(port_t p)
{
m_socks4_port = p;
}
void Socket::SetSocks4Userid(const std::string& x)
{
m_socks4_userid = x;
}
ipaddr_t Socket::GetSocks4Host()
{
return m_socks4_host;
}
port_t Socket::GetSocks4Port()
{
return m_socks4_port;
}
const std::string& Socket::GetSocks4Userid()
{
return m_socks4_userid;
}
#endif // ENABLE_SOCKS4
#ifdef ENABLE_DETACH
bool Socket::Detach()
{
if (!DeleteByHandler())
return false;
if (m_pThread)
return false;
if (m_detached)
return false;
SetDetach();
return true;
}
void Socket::DetachSocket()
{
SetDetached();
m_pThread = new SocketThread(this);
m_pThread -> SetRelease(true);
}
void Socket::OnDetached()
{
}
void Socket::SetDetach(bool x)
{
Handler().AddList(m_socket, LIST_DETACH, x);
m_detach = x;
}
bool Socket::IsDetach()
{
return m_detach;
}
void Socket::SetDetached(bool x)
{
m_detached = x;
}
const bool Socket::IsDetached() const
{
return m_detached;
}
void Socket::SetSlaveHandler(ISocketHandler *p)
{
m_slave_handler = p;
}
Socket::SocketThread::SocketThread(Socket *p)
:Thread(false)
,m_socket(p)
{
// Creator will release
}
Socket::SocketThread::~SocketThread()
{
if (IsRunning())
{
SetRelease(true);
SetRunning(false);
#ifdef _WIN32
Sleep(1000);
#else
sleep(1);
#endif
}
}
void Socket::SocketThread::Run()
{
SocketHandler h;
h.SetSlave();
h.Add(m_socket);
m_socket -> SetSlaveHandler(&h);
m_socket -> OnDetached();
while (h.GetCount() && IsRunning())
{
h.Select(0, 500000);
}
// m_socket now deleted oops
// yeah oops m_socket delete its socket thread, that means this
// so Socket will no longer delete its socket thread, instead we do this:
SetDeleteOnExit();
}
#endif // ENABLE_DETACH
#ifdef ENABLE_RESOLVER
int Socket::Resolve(const std::string& host,port_t port)
{
return Handler().Resolve(this, host, port);
}
#ifdef ENABLE_IPV6
int Socket::Resolve6(const std::string& host,port_t port)
{
return Handler().Resolve6(this, host, port);
}
#endif
int Socket::Resolve(ipaddr_t a)
{
return Handler().Resolve(this, a);
}
#ifdef ENABLE_IPV6
int Socket::Resolve(in6_addr& a)
{
return Handler().Resolve(this, a);
}
#endif
void Socket::OnResolved(int,ipaddr_t,port_t)
{
}
#ifdef ENABLE_IPV6
void Socket::OnResolved(int,in6_addr&,port_t)
{
}
#endif
void Socket::OnReverseResolved(int,const std::string&)
{
}
void Socket::OnResolveFailed(int)
{
}
#endif // ENABLE_RESOLVER
/* IP options */
bool Socket::SetIpOptions(const void *p, socklen_t len)
{
#ifdef IP_OPTIONS
if (setsockopt(GetSocket(), IPPROTO_IP, IP_OPTIONS, (char *)p, len) == -1)
{
Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_OPTIONS)", Errno, StrError(Errno), LOG_LEVEL_FATAL);
return false;
}
return true;
#else
Handler().LogError(this, "ip option not available", 0, "IP_OPTIONS", LOG_LEVEL_INFO);
return false;
#endif
}
#ifdef IP_PKTINFO
bool Socket::SetIpPktinfo(bool x)
{
int optval = x ? 1 : 0;
if (setsockopt(GetSocket(), IPPROTO_IP, IP_PKTINFO, (char *)&optval, sizeof(optval)) == -1)
{
Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_PKTINFO)", Errno, StrError(Errno), LOG_LEVEL_FATAL);
return false;
}
return true;
}
#endif
#ifdef IP_RECVTOS
bool Socket::SetIpRecvTOS(bool x)
{
int optval = x ? 1 : 0;
if (setsockopt(GetSocket(), IPPROTO_IP, IP_RECVTOS, (char *)&optval, sizeof(optval)) == -1)
{
Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_RECVTOS)", Errno, StrError(Errno), LOG_LEVEL_FATAL);
return false;
}
return true;
}
#endif
#ifdef IP_RECVTTL
bool Socket::SetIpRecvTTL(bool x)
{
int optval = x ? 1 : 0;
if (setsockopt(GetSocket(), IPPROTO_IP, IP_RECVTTL, (char *)&optval, sizeof(optval)) == -1)
{
Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_RECVTTL)", Errno, StrError(Errno), LOG_LEVEL_FATAL);
return false;
}
return true;
}
#endif
#ifdef IP_RECVOPTS
bool Socket::SetIpRecvopts(bool x)
{
int optval = x ? 1 : 0;
if (setsockopt(GetSocket(), IPPROTO_IP, IP_RECVOPTS, (char *)&optval, sizeof(optval)) == -1)
{
Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_RECVOPTS)", Errno, StrError(Errno), LOG_LEVEL_FATAL);
return false;
}
return true;
}
#endif
#ifdef IP_RETOPTS
bool Socket::SetIpRetopts(bool x)
{
int optval = x ? 1 : 0;
if (setsockopt(GetSocket(), IPPROTO_IP, IP_RETOPTS, (char *)&optval, sizeof(optval)) == -1)
{
Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_RETOPTS)", Errno, StrError(Errno), LOG_LEVEL_FATAL);
return false;
}
return true;
}
#endif
bool Socket::SetIpTOS(unsigned char tos)
{
#ifdef IP_TOS
if (setsockopt(GetSocket(), IPPROTO_IP, IP_TOS, (char *)&tos, sizeof(tos)) == -1)
{
Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_TOS)", Errno, StrError(Errno), LOG_LEVEL_FATAL);
return false;
}
return true;
#else
Handler().LogError(this, "ip option not available", 0, "IP_TOS", LOG_LEVEL_INFO);
return false;
#endif
}
unsigned char Socket::IpTOS()
{
unsigned char tos = 0;
#ifdef IP_TOS
socklen_t len = sizeof(tos);
if (getsockopt(GetSocket(), IPPROTO_IP, IP_TOS, (char *)&tos, &len) == -1)
{
Handler().LogError(this, "getsockopt(IPPROTO_IP, IP_TOS)", Errno, StrError(Errno), LOG_LEVEL_FATAL);
}
#else
Handler().LogError(this, "ip option not available", 0, "IP_TOS", LOG_LEVEL_INFO);
#endif
return tos;
}
bool Socket::SetIpTTL(int ttl)
{
#ifdef IP_TTL
if (setsockopt(GetSocket(), IPPROTO_IP, IP_TTL, (char *)&ttl, sizeof(ttl)) == -1)
{
Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_TTL)", Errno, StrError(Errno), LOG_LEVEL_FATAL);
return false;
}
return true;
#else
Handler().LogError(this, "ip option not available", 0, "IP_TTL", LOG_LEVEL_INFO);
return false;
#endif
}
int Socket::IpTTL()
{
int ttl = 0;
#ifdef IP_TTL
socklen_t len = sizeof(ttl);
if (getsockopt(GetSocket(), IPPROTO_IP, IP_TTL, (char *)&ttl, &len) == -1)
{
Handler().LogError(this, "getsockopt(IPPROTO_IP, IP_TTL)", Errno, StrError(Errno), LOG_LEVEL_FATAL);
}
#else
Handler().LogError(this, "ip option not available", 0, "IP_TTL", LOG_LEVEL_INFO);
#endif
return ttl;
}
bool Socket::SetIpHdrincl(bool x)
{
#ifdef IP_HDRINCL
int optval = x ? 1 : 0;
if (setsockopt(GetSocket(), IPPROTO_IP, IP_HDRINCL, (char *)&optval, sizeof(optval)) == -1)
{
Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_HDRINCL)", Errno, StrError(Errno), LOG_LEVEL_FATAL);
return false;
}
return true;
#else
Handler().LogError(this, "ip option not available", 0, "IP_HDRINCL", LOG_LEVEL_INFO);
return false;
#endif
}
#ifdef IP_RECVERR
bool Socket::SetIpRecverr(bool x)
{
int optval = x ? 1 : 0;
if (setsockopt(GetSocket(), IPPROTO_IP, IP_RECVERR, (char *)&optval, sizeof(optval)) == -1)
{
Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_RECVERR)", Errno, StrError(Errno), LOG_LEVEL_FATAL);
return false;
}
return true;
}
#endif
#ifdef IP_MTU_DISCOVER
bool Socket::SetIpMtudiscover(bool x)
{
int optval = x ? 1 : 0;
if (setsockopt(GetSocket(), IPPROTO_IP, IP_MTU_DISCOVER, (char *)&optval, sizeof(optval)) == -1)
{
Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_MTU_DISCOVER)", Errno, StrError(Errno), LOG_LEVEL_FATAL);
return false;
}
return true;
}
#endif
#ifdef IP_MTU
int Socket::IpMtu()
{
int mtu = 0;
socklen_t len = sizeof(mtu);
if (getsockopt(GetSocket(), IPPROTO_IP, IP_MTU, (char *)&mtu, &len) == -1)
{
Handler().LogError(this, "getsockopt(IPPROTO_IP, IP_MTU)", Errno, StrError(Errno), LOG_LEVEL_FATAL);
}
return mtu;
}
#endif
#ifdef IP_ROUTER_ALERT
bool Socket::SetIpRouterAlert(bool x)
{
int optval = x ? 1 : 0;
if (setsockopt(GetSocket(), IPPROTO_IP, IP_ROUTER_ALERT, (char *)&optval, sizeof(optval)) == -1)
{
Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_ROUTER_ALERT)", Errno, StrError(Errno), LOG_LEVEL_FATAL);
return false;
}
return true;
}
#endif
bool Socket::SetIpMulticastTTL(int ttl)
{
#ifdef IP_MULTICAST_TTL
if (setsockopt(GetSocket(), IPPROTO_IP, IP_MULTICAST_TTL, (char *)&ttl, sizeof(ttl)) == -1)
{
Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_MULTICAST_TTL)", Errno, StrError(Errno), LOG_LEVEL_FATAL);
return false;
}
return true;
#else
Handler().LogError(this, "ip option not available", 0, "IP_MULTICAST_TTL", LOG_LEVEL_INFO);
return false;
#endif
}
int Socket::IpMulticastTTL()
{
int ttl = 0;
#ifdef IP_MULTICAST_TTL
socklen_t len = sizeof(ttl);
if (getsockopt(GetSocket(), IPPROTO_IP, IP_MULTICAST_TTL, (char *)&ttl, &len) == -1)
{
Handler().LogError(this, "getsockopt(IPPROTO_IP, IP_MULTICAST_TTL)", Errno, StrError(Errno), LOG_LEVEL_FATAL);
}
#else
Handler().LogError(this, "ip option not available", 0, "IP_MULTICAST_TTL", LOG_LEVEL_INFO);
#endif
return ttl;
}
bool Socket::SetMulticastLoop(bool x)
{
#ifdef IP_MULTICAST_LOOP
int optval = x ? 1 : 0;
if (setsockopt(GetSocket(), IPPROTO_IP, IP_MULTICAST_LOOP, (char *)&optval, sizeof(optval)) == -1)
{
Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_MULTICAST_LOOP)", Errno, StrError(Errno), LOG_LEVEL_FATAL);
return false;
}
return true;
#else
Handler().LogError(this, "ip option not available", 0, "IP_MULTICAST_LOOP", LOG_LEVEL_INFO);
return false;
#endif
}
#ifdef LINUX
bool Socket::IpAddMembership(struct ip_mreqn& ref)
{
#ifdef IP_ADD_MEMBERSHIP
if (setsockopt(GetSocket(), IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&ref, sizeof(struct ip_mreqn)) == -1)
{
Handler().LogError(this, "setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP)", Errno, StrError(Errno), LOG_LEVEL_FATAL);
return false;
}
return true;
#else
Handler().LogError(this, "ip option not available", 0, "IP_ADD_MEMBERSHIP", LOG_LEVEL_INFO);
return false;
#endif
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -