mirror of
https://gitee.com/TarsCloud/TarsCpp.git
synced 2024-12-22 22:16:38 +08:00
172 lines
3.8 KiB
C++
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;
|
|
}
|
|
///////////////////////////////////////////////////////////
|
|
}
|