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,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