< prev index next >

src/java.base/windows/native/libnio/ch/Net.c

Print this page
rev 53867 : 8250521: Configure initial RTO to use minimal retry for loopback connections on Windows
Reviewed-by: alanb


 177     rv = NET_WinBind(fdval(env, fdo), &sa, sa_len, isExclBind);
 178     if (rv == SOCKET_ERROR)
 179         NET_ThrowNew(env, WSAGetLastError(), "bind");
 180 }
 181 
 182 JNIEXPORT void JNICALL
 183 Java_sun_nio_ch_Net_listen(JNIEnv *env, jclass cl, jobject fdo, jint backlog)
 184 {
 185     if (listen(fdval(env,fdo), backlog) == SOCKET_ERROR) {
 186         NET_ThrowNew(env, WSAGetLastError(), "listen");
 187     }
 188 }
 189 
 190 
 191 JNIEXPORT jint JNICALL
 192 Java_sun_nio_ch_Net_connect0(JNIEnv *env, jclass clazz, jboolean preferIPv6, jobject fdo,
 193                              jobject iao, jint port)
 194 {
 195     SOCKETADDRESS sa;
 196     int rv;

 197     int sa_len = 0;
 198     SOCKET s = (SOCKET)fdval(env, fdo);

 199 
 200     if (NET_InetAddressToSockaddr(env, iao, port, &sa, &sa_len, preferIPv6) != 0) {
 201         return IOS_THROWN;
 202     }
 203 










 204     rv = connect(s, &sa.sa, sa_len);
 205     if (rv != 0) {
 206         int err = WSAGetLastError();
 207         if (err == WSAEINPROGRESS || err == WSAEWOULDBLOCK) {
 208             return IOS_UNAVAILABLE;
 209         }
 210         NET_ThrowNew(env, err, "connect");
 211         return IOS_THROWN;
 212     } else {
 213         /* Enable WSAECONNRESET errors when a UDP socket is connected */
 214         int type = 0, optlen = sizeof(type);
 215         rv = getsockopt(s, SOL_SOCKET, SO_TYPE, (char*)&type, &optlen);
 216         if (rv == 0 && type == SOCK_DGRAM) {
 217             setConnectionReset(s, TRUE);
 218         }
 219     }
 220     return 1;
 221 }
 222 
 223 JNIEXPORT jint JNICALL
 224 Java_sun_nio_ch_Net_localPort(JNIEnv *env, jclass clazz, jobject fdo)
 225 {
 226     SOCKETADDRESS sa;
 227     int sa_len = sizeof(sa);
 228 
 229     if (getsockname(fdval(env, fdo), &sa.sa, &sa_len) < 0) {
 230         int error = WSAGetLastError();
 231         if (error == WSAEINVAL) {
 232             return 0;
 233         }
 234         NET_ThrowNew(env, error, "getsockname");
 235         return IOS_THROWN;
 236     }




 177     rv = NET_WinBind(fdval(env, fdo), &sa, sa_len, isExclBind);
 178     if (rv == SOCKET_ERROR)
 179         NET_ThrowNew(env, WSAGetLastError(), "bind");
 180 }
 181 
 182 JNIEXPORT void JNICALL
 183 Java_sun_nio_ch_Net_listen(JNIEnv *env, jclass cl, jobject fdo, jint backlog)
 184 {
 185     if (listen(fdval(env,fdo), backlog) == SOCKET_ERROR) {
 186         NET_ThrowNew(env, WSAGetLastError(), "listen");
 187     }
 188 }
 189 
 190 
 191 JNIEXPORT jint JNICALL
 192 Java_sun_nio_ch_Net_connect0(JNIEnv *env, jclass clazz, jboolean preferIPv6, jobject fdo,
 193                              jobject iao, jint port)
 194 {
 195     SOCKETADDRESS sa;
 196     int rv;
 197     int so_rv;
 198     int sa_len = 0;
 199     SOCKET s = (SOCKET)fdval(env, fdo);
 200     int type = 0, optlen = sizeof(type);
 201 
 202     if (NET_InetAddressToSockaddr(env, iao, port, &sa, &sa_len, preferIPv6) != 0) {
 203         return IOS_THROWN;
 204     }
 205 
 206     so_rv = getsockopt(s, SOL_SOCKET, SO_TYPE, (char*)&type, &optlen);
 207 
 208     /**
 209      * Windows has a very long socket connect timeout of 2 seconds.
 210      * If it's the loopback adapter we can shorten the wait interval.
 211      */
 212     if (so_rv == 0 && type == SOCK_STREAM && IS_LOOPBACK_ADDRESS(&sa)) {
 213         NET_EnableFastTcpLoopbackConnect((jint)s);
 214     }
 215 
 216     rv = connect(s, &sa.sa, sa_len);
 217     if (rv != 0) {
 218         int err = WSAGetLastError();
 219         if (err == WSAEINPROGRESS || err == WSAEWOULDBLOCK) {
 220             return IOS_UNAVAILABLE;
 221         }
 222         NET_ThrowNew(env, err, "connect");
 223         return IOS_THROWN;
 224     } else {
 225         /* Enable WSAECONNRESET errors when a UDP socket is connected */
 226         if (so_rv == 0 && type == SOCK_DGRAM) {


 227             setConnectionReset(s, TRUE);
 228         }
 229     }
 230     return 1;
 231 }
 232 
 233 JNIEXPORT jint JNICALL
 234 Java_sun_nio_ch_Net_localPort(JNIEnv *env, jclass clazz, jobject fdo)
 235 {
 236     SOCKETADDRESS sa;
 237     int sa_len = sizeof(sa);
 238 
 239     if (getsockname(fdval(env, fdo), &sa.sa, &sa_len) < 0) {
 240         int error = WSAGetLastError();
 241         if (error == WSAEINVAL) {
 242             return 0;
 243         }
 244         NET_ThrowNew(env, error, "getsockname");
 245         return IOS_THROWN;
 246     }


< prev index next >