WiFiClient.cpp - Fix connect() behavior (#2784)
* WiFiClient.cpp - Fix connect() behavior * lwip_connect_r() : check return code
This commit is contained in:
		
							parent
							
								
									ca7106e97e
								
							
						
					
					
						commit
						d5fdd715ef
					
				| @ -226,14 +226,41 @@ int WiFiClient::connect(IPAddress ip, uint16_t port, int32_t timeout) | |||||||
|     FD_SET(sockfd, &fdset); |     FD_SET(sockfd, &fdset); | ||||||
|     tv.tv_sec = 0; |     tv.tv_sec = 0; | ||||||
|     tv.tv_usec = timeout * 1000; |     tv.tv_usec = timeout * 1000; | ||||||
|     lwip_connect_r(sockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr)); | 
 | ||||||
|     int res = select(sockfd + 1, nullptr, &fdset, nullptr, timeout<0 ? nullptr : &tv); |     int res = lwip_connect_r(sockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr)); | ||||||
|     if (res != 1) |     if (res < 0 && errno != EINPROGRESS) { | ||||||
|     { |         log_e("connect on fd %d, errno: %d, \"%s\"", sockfd, errno, strerror(errno)); | ||||||
|         log_e("select: %d",errno); |  | ||||||
|         close(sockfd); |         close(sockfd); | ||||||
|         return 0; |         return 0; | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     res = select(sockfd + 1, nullptr, &fdset, nullptr, timeout<0 ? nullptr : &tv); | ||||||
|  |     if (res < 0) { | ||||||
|  |         log_e("select on fd %d, errno: %d, \"%s\"", sockfd, errno, strerror(errno)); | ||||||
|  |         close(sockfd); | ||||||
|  |         return 0; | ||||||
|  |     } else if (res == 0) { | ||||||
|  |         log_i("select returned due to timeout %d ms for fd %d", timeout, sockfd); | ||||||
|  |         close(sockfd); | ||||||
|  |         return 0; | ||||||
|  |     } else { | ||||||
|  |         int sockerr; | ||||||
|  |         socklen_t len = (socklen_t)sizeof(int); | ||||||
|  |         res = getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &sockerr, &len); | ||||||
|  | 
 | ||||||
|  |         if (res < 0) { | ||||||
|  |             log_e("getsockopt on fd %d, errno: %d, \"%s\"", sockfd, errno, strerror(errno)); | ||||||
|  |             close(sockfd); | ||||||
|  |             return 0; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (sockerr != 0) { | ||||||
|  |             log_e("socket error on fd %d, errno: %d, \"%s\"", sockfd, sockerr, strerror(sockerr)); | ||||||
|  |             close(sockfd); | ||||||
|  |             return 0; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     fcntl( sockfd, F_SETFL, fcntl( sockfd, F_GETFL, 0 ) & (~O_NONBLOCK) ); |     fcntl( sockfd, F_SETFL, fcntl( sockfd, F_GETFL, 0 ) & (~O_NONBLOCK) ); | ||||||
|     clientSocketHandle.reset(new WiFiClientSocketHandle(sockfd)); |     clientSocketHandle.reset(new WiFiClientSocketHandle(sockfd)); | ||||||
|     _rxBuffer.reset(new WiFiClientRxBuffer(sockfd)); |     _rxBuffer.reset(new WiFiClientRxBuffer(sockfd)); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user