Commit 146e8a08d57c2db71d54cb6db3513ed50d34d52b

Authored by Stéphane Raimbault
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  
... ...