TarsCloud_TarsCpp/servant/libservant/EndpointInfo.cpp
2018-10-22 22:11:06 -04:00

172 lines
3.8 KiB
C++

/**
* Tencent is pleased to support the open source community by making Tars available.
*
* Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved.
*
* Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* https://opensource.org/licenses/BSD-3-Clause
*
* Unless required by applicable law or agreed to in writing, software distributed
* under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
* CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
#include "servant/EndpointInfo.h"
#include "servant/TarsLogger.h"
#include "servant/NetworkUtil.h"
#include "util/tc_socket.h"
namespace tars
{
EndpointInfo::EndpointInfo()
: _port(0)
, _grid(0)
, _qos(0)
, _type(TCP)
, _weight(-1)
, _weighttype(0)
, _authType(0)
, _isIPv6(false)
{
_setDivision.clear();
memset(&_addr,0,sizeof(_addr));
}
EndpointInfo::EndpointInfo(const string& host, uint16_t port, EndpointInfo::EType type, int32_t grid, const string & setDivision, int qos, int weight, unsigned int weighttype, int authType)
: _host(host)
, _port(port)
, _grid(grid)
, _qos(qos)
, _type(type)
, _setDivision(setDivision)
, _weight(weight)
, _weighttype(weighttype)
, _authType(authType)
{
_isIPv6 = TC_Socket::addressIsIPv6(host);
try
{
if(_weighttype == 0)
{
_weight = -1;
}
else
{
if(_weight == -1)
{
_weight = 100;
}
_weight = (_weight > 100 ? 100 : _weight);
}
if (_isIPv6)
{
NetworkUtil::getAddress(_host, _port, _addr.in6);
}
else
{
NetworkUtil::getAddress(_host, _port, _addr.in);
}
_cmpDesc = createCompareDesc();
_desc = createDesc();
}
catch (...)
{
TLOGERROR("[ERROR:getAddress fail:" << _host << ":" << _port << "]" << endl);
}
}
string EndpointInfo::createCompareDesc()
{
ostringstream os;
if (_type == EndpointInfo::UDP) { os << "udp:"; }
if (_type == EndpointInfo::TCP) { os << "tcp:"; }
if (_type == EndpointInfo::SSL) { os << "ssl:"; }
os << _grid << ":" << _host << ":" << _port
<< ":" << _setDivision << ":" << _qos << ":" << _weight << ":" << _weighttype << ":" << _authType;
return os.str();
}
string EndpointInfo::createDesc() const
{
ostringstream os;
if (_type == EndpointInfo::TCP)
os << "tcp";
else if (_type == EndpointInfo::UDP)
os << "udp";
else
os << "ssl";
os << " -h " << host();
os << " -p " << port();
if(0 != _grid)
os << " -g " << _grid;
if (!_setDivision.empty())
{
os << " -s " << _setDivision;
}
if(0 != _qos)
os << " -q " << _qos;
if(0 != _authType)
os << " -e " << _authType;
return os.str();
}
bool EndpointInfo::operator == (const EndpointInfo& r) const
{
return (_cmpDesc == r._cmpDesc);
}
bool EndpointInfo::operator < (const EndpointInfo& r) const
{
return (_cmpDesc < r._cmpDesc);
}
string EndpointInfo::host() const
{
return string(_host);
}
int32_t EndpointInfo::grid() const
{
return _grid;
}
uint16_t EndpointInfo::port() const
{
return _port;
}
const struct sockaddr_in& EndpointInfo::addr() const
{
return _addr.in;
}
const struct sockaddr * EndpointInfo::addrPtr() const
{
return _isIPv6 ? (struct sockaddr *)&_addr.in6 : (struct sockaddr *)&_addr.in;
}
EndpointInfo::EType EndpointInfo::type() const
{
return _type;
}
const string& EndpointInfo::setDivision() const
{
return _setDivision;
}
///////////////////////////////////////////////////////////
}