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 |