added Socket::setNonBlock(), Socket::initConnectNB(), Socket::finiConnectNB()
This commit is contained in:
parent
a83005ca99
commit
24d8c70835
@ -78,11 +78,15 @@ public:
|
||||
int setTcpNodelay (int n) QSE_CPP_NOEXCEPT;
|
||||
int setOobInline (int n) QSE_CPP_NOEXCEPT;
|
||||
int setIpv6Only (int n) QSE_CPP_NOEXCEPT;
|
||||
int setNonBlock (int n) QSE_CPP_NOEXCEPT;
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
int shutdown (int how = 2) QSE_CPP_NOEXCEPT;
|
||||
int connect (const SocketAddress& target) QSE_CPP_NOEXCEPT;
|
||||
|
||||
int initConnectNB (const SocketAddress& target) QSE_CPP_NOEXCEPT;
|
||||
int finiConnectNB () QSE_CPP_NOEXCEPT;
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
int bind (const SocketAddress& target) QSE_CPP_NOEXCEPT;
|
||||
// bind to the ip address of the interface
|
||||
|
@ -73,7 +73,12 @@ typedef enum qse_mux_errnum_t qse_mux_errnum_t;
|
||||
enum qse_mux_evtmask_t
|
||||
{
|
||||
QSE_MUX_IN = (1 << 0),
|
||||
QSE_MUX_OUT = (1 << 1)
|
||||
QSE_MUX_OUT = (1 << 1),
|
||||
|
||||
/* output only below - available if the underlying system multiplexer returns relevant information */
|
||||
QSE_MUX_RDHUP = (1 << 2),
|
||||
QSE_MUX_HUP = (1 << 3),
|
||||
QSE_MUX_ERR = (1 << 4)
|
||||
};
|
||||
typedef enum qse_mux_evtmask_t qse_mux_evtmask_t;
|
||||
|
||||
|
@ -100,7 +100,7 @@ QSE_EXPORT int qse_set_sck_cloexec (
|
||||
|
||||
QSE_EXPORT int qse_init_sck_conn (
|
||||
qse_sck_hnd_t handle,
|
||||
const qse_nwad_t* nwad
|
||||
const qse_skad_t* skad
|
||||
);
|
||||
|
||||
QSE_EXPORT int qse_fini_sck_conn (
|
||||
|
@ -286,6 +286,19 @@ int Socket::setIpv6Only (int n) QSE_CPP_NOEXCEPT
|
||||
#endif
|
||||
}
|
||||
|
||||
int Socket::setNonBlock (int n) QSE_CPP_NOEXCEPT
|
||||
{
|
||||
QSE_ASSERT (qse_is_sck_valid(this->handle));
|
||||
|
||||
if (qse_set_sck_nonblock(this->handle, n) <= -1)
|
||||
{
|
||||
this->setErrorFmt (syserr_to_errnum(errno), QSE_T("%hs"), strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int Socket::shutdown (int how) QSE_CPP_NOEXCEPT
|
||||
{
|
||||
if (this->handle != QSE_INVALID_SCKHND)
|
||||
@ -314,6 +327,33 @@ int Socket::connect (const SocketAddress& target) QSE_CPP_NOEXCEPT
|
||||
return 0;
|
||||
}
|
||||
|
||||
int Socket::initConnectNB (const SocketAddress& target) QSE_CPP_NOEXCEPT
|
||||
{
|
||||
QSE_ASSERT (qse_is_sck_valid(this->handle));
|
||||
|
||||
if (qse_init_sck_conn(this->handle, target.getAddrPtr()) <= -1)
|
||||
{
|
||||
this->setErrorFmt (syserr_to_errnum(errno), QSE_T("%hs"), strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int Socket::finiConnectNB () QSE_CPP_NOEXCEPT
|
||||
{
|
||||
QSE_ASSERT (qse_is_sck_valid(this->handle));
|
||||
|
||||
if (qse_fini_sck_conn(this->handle) <= -1)
|
||||
{
|
||||
this->setErrorFmt (syserr_to_errnum(errno), QSE_T("%hs"), strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int Socket::bind (const SocketAddress& target) QSE_CPP_NOEXCEPT
|
||||
{
|
||||
QSE_ASSERT (qse_is_sck_valid(this->handle));
|
||||
|
@ -1000,9 +1000,12 @@ int qse_mux_poll (qse_mux_t* mux, const qse_ntime_t* tmout)
|
||||
xevt.mask = 0;
|
||||
if (mux->ee.ptr[i].events & EPOLLIN) xevt.mask |= QSE_MUX_IN;
|
||||
if (mux->ee.ptr[i].events & EPOLLOUT) xevt.mask |= QSE_MUX_OUT;
|
||||
|
||||
if (mux->ee.ptr[i].events & (EPOLLHUP | EPOLLERR))
|
||||
if (mux->ee.ptr[i].events & (EPOLLRDHUP | EPOLLHUP | EPOLLERR))
|
||||
{
|
||||
if (mux->ee.ptr[i].events & EPOLLRDHUP) xevt.mask |= QSE_MUX_RDHUP;
|
||||
if (mux->ee.ptr[i].events & EPOLLHUP) xevt.mask |= QSE_MUX_HUP;
|
||||
if (mux->ee.ptr[i].events & EPOLLERR) xevt.mask |= QSE_MUX_ERR;
|
||||
|
||||
if (evt->mask & QSE_MUX_IN) xevt.mask |= QSE_MUX_IN;
|
||||
if (evt->mask & QSE_MUX_OUT) xevt.mask |= QSE_MUX_OUT;
|
||||
}
|
||||
|
@ -197,7 +197,7 @@ int qse_set_sck_cloexec (qse_sck_hnd_t handle, int enabled)
|
||||
#endif
|
||||
}
|
||||
|
||||
int qse_init_sck_conn (qse_sck_hnd_t handle, const qse_nwad_t* nwad)
|
||||
int qse_init_sck_conn (qse_sck_hnd_t handle, const qse_skad_t* skad)
|
||||
{
|
||||
int n;
|
||||
#if defined(_WIN32)
|
||||
@ -207,11 +207,6 @@ int qse_init_sck_conn (qse_sck_hnd_t handle, const qse_nwad_t* nwad)
|
||||
#else
|
||||
int saved = 0;
|
||||
#endif
|
||||
qse_skad_t skad;
|
||||
int skadlen;
|
||||
|
||||
skadlen = qse_nwadtoskad (nwad, &skad);
|
||||
if (skadlen <= -1) return -1;
|
||||
|
||||
#if defined(_WIN32)
|
||||
/* switch to the non-blocking mode */
|
||||
@ -223,7 +218,7 @@ int qse_init_sck_conn (qse_sck_hnd_t handle, const qse_nwad_t* nwad)
|
||||
}
|
||||
|
||||
/* attempt to connet */
|
||||
n = connect(handle, (struct sockaddr*)&skad, skadlen);
|
||||
n = connect(handle, (struct sockaddr*)skad, qse_skadsize(skad));
|
||||
if (n == -1 && WSAGetLastError() != WSAEWOULDBLOCK)
|
||||
{
|
||||
/* attempt to restore to the blocking mode upon failure.
|
||||
@ -235,10 +230,10 @@ int qse_init_sck_conn (qse_sck_hnd_t handle, const qse_nwad_t* nwad)
|
||||
#elif defined(__OS2__)
|
||||
|
||||
enabled = 1;
|
||||
if (ioctl (handle, FIONBIO, (char*)&enabled, sizeof(enabled)) <= -1) return -1;
|
||||
if (ioctl(handle, FIONBIO, (char*)&enabled, sizeof(enabled)) <= -1) return -1;
|
||||
|
||||
/* attempt to connet */
|
||||
n = connect (handle, (struct sockaddr*)&skad, skadlen);
|
||||
n = connect (handle, (struct sockaddr*)skad, qse_skadsize(skad));
|
||||
if (n == -1 && sock_errno() != EINPROGRESS)
|
||||
{
|
||||
/* attempt to restore to the blocking mode upon failure.
|
||||
@ -250,21 +245,21 @@ int qse_init_sck_conn (qse_sck_hnd_t handle, const qse_nwad_t* nwad)
|
||||
|
||||
#else
|
||||
|
||||
/* switch to the non-blocking mode */
|
||||
/* switch to the non-blocking mode if necessary */
|
||||
saved = fcntl (handle, F_GETFL, 0);
|
||||
if (saved == -1) return -1;
|
||||
if (fcntl(handle, F_SETFL, saved | O_NONBLOCK) == -1) return -1;
|
||||
if (!(saved & O_NONBLOCK) && fcntl(handle, F_SETFL, saved | O_NONBLOCK) == -1) return -1;
|
||||
|
||||
/* attempt to connet */
|
||||
do
|
||||
{
|
||||
n = connect(handle, (struct sockaddr*)&skad, skadlen);
|
||||
n = connect(handle, (struct sockaddr*)skad, qse_skadsize(skad));
|
||||
}
|
||||
while (n == -1 && errno == EINTR);
|
||||
|
||||
if (n == -1 && errno != EINPROGRESS)
|
||||
{
|
||||
fcntl (handle, F_SETFL, saved); /* restore the flags upon failure */
|
||||
if (!(saved & O_NONBLOCK)) fcntl (handle, F_SETFL, saved); /* restore the flags upon failure */
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user