Skip to content

Commit

Permalink
Fix nasa#862, comments describing select after connect
Browse files Browse the repository at this point in the history
A select() is used after connect() to provide application-controlled
timeout on the connection initiation.

This just adds some comments to describe why this is done.  It also
adds a debug statement if the connect fails for a reason other than
EINPROGRESS.
  • Loading branch information
jphickey committed Mar 15, 2021
1 parent ead5723 commit ef94a3d
Showing 1 changed file with 18 additions and 0 deletions.
18 changes: 18 additions & 0 deletions src/os/portable/os-impl-bsd-sockets.c
Original file line number Diff line number Diff line change
Expand Up @@ -273,10 +273,24 @@ int32 OS_SocketConnect_Impl(const OS_object_token_t *token, const OS_SockAddr_t
{
if (errno != EINPROGRESS)
{
OS_DEBUG("connect: %s\n", strerror(errno));
return_code = OS_ERROR;
}
else
{
/*
* If the socket was created in nonblocking mode (O_NONBLOCK flag) then the connect
* runs in the background and connect() returns EINPROGRESS. In this case we still
* want to provide the "normal" (blocking) semantics to the calling app, such that
* when OS_SocketConnect() returns, the socket is ready for use.
*
* To provide consistent behavior to calling apps, this does a select() to wait
* for the socket to become writable, meaning that the remote side is connected.
*
* An important point here is that the calling app can control the timeout. If the
* normal/blocking connect() was used, the OS/IP stack controls the timeout, and it
* can be quite long.
*/
operation = OS_STREAM_STATE_WRITABLE;
if (impl->selectable)
{
Expand All @@ -290,6 +304,10 @@ int32 OS_SocketConnect_Impl(const OS_object_token_t *token, const OS_SockAddr_t
}
else
{
/*
* The SO_ERROR socket flag should also read back zero.
* If not zero, something went wrong during connect
*/
sockopt = 0;
slen = sizeof(sockopt);
os_status = getsockopt(impl->fd, SOL_SOCKET, SO_ERROR, &sockopt, &slen);
Expand Down

0 comments on commit ef94a3d

Please sign in to comment.