in nlsCppSdk/transport/connectNode.cpp [3069:3187]
int ConnectNode::connectProcess(const char *ip, int aiFamily) {
EXIT_CANCEL_CHECK(_exitStatus, this);
evutil_socket_t sockFd = socket(aiFamily, SOCK_STREAM, 0);
if (sockFd < 0) {
LOG_ERROR("Node(%p) socket failed. aiFamily:%d, sockFd:%d. error mesg:%s.",
this, aiFamily, sockFd,
evutil_socket_error_to_string(evutil_socket_geterror(sockFd)));
return -(SocketFailed);
} else {
// LOG_DEBUG("Node(%p) socket success, sockFd:%d.", this, sockFd);
}
struct linger so_linger;
so_linger.l_onoff = 1;
so_linger.l_linger = 0;
if (setsockopt(sockFd, SOL_SOCKET, SO_LINGER, (char *)&so_linger,
sizeof(struct linger)) < 0) {
LOG_ERROR("Node(%p) set SO_LINGER failed.", this);
return -(SetSocketoptFailed);
}
if (evutil_make_socket_nonblocking(sockFd) < 0) {
LOG_ERROR("Node(%p) evutil_make_socket_nonblocking failed.", this);
return -(EvutilSocketFalied);
}
LOG_INFO("Node(%p) new socket ip:%s port:%d Fd:%d.", this, ip, _url._port,
sockFd);
short events = EV_READ | EV_WRITE | EV_TIMEOUT | EV_FINALIZE;
// LOG_DEBUG("Node(%p) set events(%d) for connectEventCallback.", this,
// events);
if (NULL == _connectEvent) {
_connectEvent = event_new(_eventThread->_workBase, sockFd, events,
WorkThread::connectEventCallback, this);
if (NULL == _connectEvent) {
LOG_ERROR("Node(%p) new event(_connectEvent) failed.", this);
return -(EventEmpty);
}
} else {
event_del(_connectEvent);
event_assign(_connectEvent, _eventThread->_workBase, sockFd, events,
WorkThread::connectEventCallback, this);
}
#ifdef ENABLE_HIGH_EFFICIENCY
if (NULL == _connectTimerEvent) {
_connectTimerEvent = evtimer_new(
_eventThread->_workBase, WorkThread::connectTimerEventCallback, this);
if (NULL == _connectTimerEvent) {
LOG_ERROR("Node(%p) new event(_connectTimerEvent) failed.", this);
return -(EventEmpty);
}
}
#endif
if (_enableRecvTv) {
events = EV_READ | EV_TIMEOUT | EV_PERSIST | EV_FINALIZE;
} else {
events = EV_READ | EV_PERSIST | EV_FINALIZE;
}
// LOG_DEBUG("Node(%p) set events(%d) for readEventCallback with sockFd(%d)",
// this, events, sockFd);
if (NULL == _readEvent) {
_readEvent = event_new(_eventThread->_workBase, sockFd, events,
WorkThread::readEventCallBack, this);
if (NULL == _readEvent) {
LOG_ERROR("Node(%p) new event(_readEvent) failed.", this);
return -(EventEmpty);
}
} else {
event_del(_readEvent);
event_assign(_readEvent, _eventThread->_workBase, sockFd, events,
WorkThread::readEventCallBack, this);
}
events = EV_WRITE | EV_TIMEOUT | EV_FINALIZE;
// LOG_DEBUG("Node(%p) set events(%d) for writeEventCallback with sockFd(%d)",
// this, events, sockFd);
if (NULL == _writeEvent) {
_writeEvent = event_new(_eventThread->_workBase, sockFd, events,
WorkThread::writeEventCallBack, this);
if (NULL == _writeEvent) {
LOG_ERROR("Node(%p) new event(_writeEvent) failed.", this);
return -(EventEmpty);
}
} else {
event_del(_writeEvent);
event_assign(_writeEvent, _eventThread->_workBase, sockFd, events,
WorkThread::writeEventCallBack, this);
}
_aiFamily = aiFamily;
if (aiFamily == AF_INET) {
memset(&_addrV4, 0, sizeof(_addrV4));
_addrV4.sin_family = AF_INET;
_addrV4.sin_port = htons(_url._port);
if (inet_pton(AF_INET, ip, &_addrV4.sin_addr) <= 0) {
LOG_ERROR("Node(%p) IpV4 inet_pton failed.", this);
evutil_closesocket(sockFd);
return -(SetSocketoptFailed);
}
} else if (aiFamily == AF_INET6) {
memset(&_addrV6, 0, sizeof(_addrV6));
_addrV6.sin6_family = AF_INET6;
_addrV6.sin6_port = htons(_url._port);
if (inet_pton(AF_INET6, ip, &_addrV6.sin6_addr) <= 0) {
LOG_ERROR("Node(%p) IpV6 inet_pton failed.", this);
evutil_closesocket(sockFd);
return -(SetSocketoptFailed);
}
}
_socketFd = sockFd;
return socketConnect();
}