jdk/src/windows/native/sun/nio/ch/Net.c
changeset 5777 1c86018749bd
parent 5506 202f599c92aa
child 7668 d4a77089c587
equal deleted inserted replaced
5776:5f48622225ab 5777:1c86018749bd
    65  * Copy IPv6 address as jbytearray to target
    65  * Copy IPv6 address as jbytearray to target
    66  */
    66  */
    67 #define COPY_INET6_ADDRESS(env, source, target) \
    67 #define COPY_INET6_ADDRESS(env, source, target) \
    68     (*env)->GetByteArrayRegion(env, source, 0, 16, target)
    68     (*env)->GetByteArrayRegion(env, source, 0, 16, target)
    69 
    69 
       
    70 /**
       
    71  * Enable or disable receipt of WSAECONNRESET errors.
       
    72  */
       
    73 static void setConnectionReset(SOCKET s, BOOL enable) {
       
    74     DWORD bytesReturned = 0;
       
    75     WSAIoctl(s, SIO_UDP_CONNRESET, &enable, sizeof(enable),
       
    76              NULL, 0, &bytesReturned, NULL, NULL);
       
    77 }
    70 
    78 
    71 
    79 
    72 JNIEXPORT void JNICALL
    80 JNIEXPORT void JNICALL
    73 Java_sun_nio_ch_Net_initIDs(JNIEnv *env, jclass clazz)
    81 Java_sun_nio_ch_Net_initIDs(JNIEnv *env, jclass clazz)
    74 {
    82 {
   107         if (domain == AF_INET6) {
   115         if (domain == AF_INET6) {
   108             int opt = 0;
   116             int opt = 0;
   109             setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY,
   117             setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY,
   110                        (const char *)&opt, sizeof(opt));
   118                        (const char *)&opt, sizeof(opt));
   111         }
   119         }
       
   120 
       
   121         /* Disable WSAECONNRESET errors for initially unconnected UDP sockets */
       
   122         if (!stream) {
       
   123             setConnectionReset(s, FALSE);
       
   124         }
       
   125 
   112     } else {
   126     } else {
   113         NET_ThrowNew(env, WSAGetLastError(), "socket");
   127         NET_ThrowNew(env, WSAGetLastError(), "socket");
   114     }
   128     }
   115 
   129 
   116     return (jint)s;
   130     return (jint)s;
   147                              jobject iao, jint port)
   161                              jobject iao, jint port)
   148 {
   162 {
   149     SOCKETADDRESS sa;
   163     SOCKETADDRESS sa;
   150     int rv;
   164     int rv;
   151     int sa_len;
   165     int sa_len;
       
   166     SOCKET s = (SOCKET)fdval(env, fdo);
   152 
   167 
   153     if (NET_InetAddressToSockaddr(env, iao, port, (struct sockaddr *)&sa, &sa_len, preferIPv6) != 0) {
   168     if (NET_InetAddressToSockaddr(env, iao, port, (struct sockaddr *)&sa, &sa_len, preferIPv6) != 0) {
   154         return IOS_THROWN;
   169         return IOS_THROWN;
   155     }
   170     }
   156 
   171 
   157     rv = connect(fdval(env, fdo), (struct sockaddr *)&sa, sa_len);
   172     rv = connect(s, (struct sockaddr *)&sa, sa_len);
   158     if (rv != 0) {
   173     if (rv != 0) {
   159         int err = WSAGetLastError();
   174         int err = WSAGetLastError();
   160         if (err == WSAEINPROGRESS || err == WSAEWOULDBLOCK) {
   175         if (err == WSAEINPROGRESS || err == WSAEWOULDBLOCK) {
   161             return IOS_UNAVAILABLE;
   176             return IOS_UNAVAILABLE;
   162         }
   177         }
   163         NET_ThrowNew(env, err, "connect");
   178         NET_ThrowNew(env, err, "connect");
   164         return IOS_THROWN;
   179         return IOS_THROWN;
       
   180     } else {
       
   181         /* Enable WSAECONNRESET errors when a UDP socket is connected */
       
   182         int type = 0, optlen = sizeof(type);
       
   183         rv = getsockopt(s, SOL_SOCKET, SO_TYPE, (char*)&type, &optlen);
       
   184         if (rv == 0 && type == SOCK_DGRAM) {
       
   185             setConnectionReset(s, TRUE);
       
   186         }
   165     }
   187     }
   166     return 1;
   188     return 1;
   167 }
   189 }
   168 
   190 
   169 JNIEXPORT jint JNICALL
   191 JNIEXPORT jint JNICALL