Commit 146e8a08d57c2db71d54cb6db3513ed50d34d52b
1 parent
8dc21dda
More robust way to establish the connection in non blocking mode
Showing
1 changed file
with
11 additions
and
5 deletions
src/modbus-tcp.c
| @@ -246,9 +246,10 @@ static int _connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen, | @@ -246,9 +246,10 @@ static int _connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen, | ||
| 246 | rc = connect(sockfd, addr, addrlen); | 246 | rc = connect(sockfd, addr, addrlen); |
| 247 | if (rc == -1 && errno == EINPROGRESS) { | 247 | if (rc == -1 && errno == EINPROGRESS) { |
| 248 | fd_set wset; | 248 | fd_set wset; |
| 249 | - int err; | ||
| 250 | - socklen_t errlen = sizeof(err); | 249 | + int optval; |
| 250 | + socklen_t optlen = sizeof(optval); | ||
| 251 | 251 | ||
| 252 | + /* Wait to be available in writing */ | ||
| 252 | FD_ZERO(&wset); | 253 | FD_ZERO(&wset); |
| 253 | FD_SET(sockfd, &wset); | 254 | FD_SET(sockfd, &wset); |
| 254 | rc = select(sockfd + 1, NULL, &wset, NULL, tv); | 255 | rc = select(sockfd + 1, NULL, &wset, NULL, tv); |
| @@ -257,10 +258,15 @@ static int _connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen, | @@ -257,10 +258,15 @@ static int _connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen, | ||
| 257 | return -1; | 258 | return -1; |
| 258 | } | 259 | } |
| 259 | 260 | ||
| 260 | - /* The socket is available for writing if it returns 0 */ | ||
| 261 | - return getsockopt(sockfd, SOL_SOCKET, SO_ERROR, (void *)&err, &errlen); | 261 | + /* The connection is established if SO_ERROR and optval are set to 0 */ |
| 262 | + rc = getsockopt(sockfd, SOL_SOCKET, SO_ERROR, (void *)&optval, &optlen); | ||
| 263 | + if (rc == 0 && optval == 0) { | ||
| 264 | + return 0; | ||
| 265 | + } else { | ||
| 266 | + errno = ECONNREFUSED; | ||
| 267 | + return -1; | ||
| 268 | + } | ||
| 262 | } | 269 | } |
| 263 | - /* 0 or (-1 and errno != EINPROGRESS) */ | ||
| 264 | return rc; | 270 | return rc; |
| 265 | } | 271 | } |
| 266 | 272 |