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 | 246 | rc = connect(sockfd, addr, addrlen); |
| 247 | 247 | if (rc == -1 && errno == EINPROGRESS) { |
| 248 | 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 | 253 | FD_ZERO(&wset); |
| 253 | 254 | FD_SET(sockfd, &wset); |
| 254 | 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 | 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 | 270 | return rc; |
| 265 | 271 | } |
| 266 | 272 | ... | ... |