@@ -1283,10 +1283,8 @@ int Socket::Connect(const timespec* abstime,
12831283 _ssl_state = SSL_OFF;
12841284 }
12851285 struct sockaddr_storage serv_addr;
1286- struct sockaddr_storage cli_addr;
12871286 socklen_t addr_size = 0 ;
1288- if (butil::endpoint2sockaddr (remote_side (), &serv_addr, &addr_size) != 0 ||
1289- butil::endpoint2sockaddr (local_side (), &cli_addr, &addr_size) != 0 ) {
1287+ if (butil::endpoint2sockaddr (remote_side (), &serv_addr, &addr_size) != 0 ) {
12901288 PLOG (ERROR) << " Fail to get sockaddr" ;
12911289 return -1 ;
12921290 }
@@ -1298,10 +1296,16 @@ int Socket::Connect(const timespec* abstime,
12981296 CHECK_EQ (0 , butil::make_close_on_exec (sockfd));
12991297 // We need to do async connect (to manage the timeout by ourselves).
13001298 CHECK_EQ (0 , butil::make_non_blocking (sockfd));
1301-
1302- if (::bind (sockfd, (struct sockaddr *)& cli_addr, addr_size) != 0 ) {
1303- LOG (FATAL) << " Fail to bind socket, errno=" << strerror (errno);
1304- return -1 ;
1299+ if (local_side ().ip != butil::IP_ANY) {
1300+ struct sockaddr_storage cli_addr;
1301+ if (butil::endpoint2sockaddr (local_side (), &cli_addr, &addr_size) != 0 ) {
1302+ PLOG (ERROR) << " Fail to get client sockaddr" ;
1303+ return -1 ;
1304+ }
1305+ if (::bind (sockfd, (struct sockaddr *)&cli_addr, addr_size) != 0 ) {
1306+ PLOG (ERROR) << " Fail to bind client socket, errno=" << strerror (errno);
1307+ return -1 ;
1308+ }
13051309 }
13061310 const int rc = ::connect (
13071311 sockfd, (struct sockaddr *)&serv_addr, addr_size);
@@ -2817,7 +2821,7 @@ int Socket::GetPooledSocket(SocketUniquePtr* pooled_socket) {
28172821 if (socket_pool == NULL ) {
28182822 SocketOptions opt;
28192823 opt.remote_side = remote_side ();
2820- opt.local_side = local_side ();
2824+ opt.local_side = butil::EndPoint ( local_side (). ip , 0 );
28212825 opt.user = user ();
28222826 opt.on_edge_triggered_events = _on_edge_triggered_events;
28232827 opt.initial_ssl_ctx = _ssl_ctx;
@@ -2919,6 +2923,7 @@ int Socket::GetShortSocket(SocketUniquePtr* short_socket) {
29192923 SocketId id;
29202924 SocketOptions opt;
29212925 opt.remote_side = remote_side ();
2926+ opt.local_side = butil::EndPoint (local_side ().ip , 0 );
29222927 opt.user = user ();
29232928 opt.on_edge_triggered_events = _on_edge_triggered_events;
29242929 opt.initial_ssl_ctx = _ssl_ctx;
0 commit comments