94 while(1) { |
94 while(1) { |
95 if (select(/*ignored*/fd+1, &tbl, 0, 0, &t) <= 0) { |
95 if (select(/*ignored*/fd+1, &tbl, 0, 0, &t) <= 0) { |
96 break; |
96 break; |
97 } |
97 } |
98 if (recvfrom(fd, buf, 1, MSG_PEEK, |
98 if (recvfrom(fd, buf, 1, MSG_PEEK, |
99 (struct sockaddr *)&sa, &addrlen) != SOCKET_ERROR) { |
99 &sa.sa, &addrlen) != SOCKET_ERROR) { |
100 break; |
100 break; |
101 } |
101 } |
102 if (WSAGetLastError() != WSAECONNRESET) { |
102 if (WSAGetLastError() != WSAECONNRESET) { |
103 /* some other error - we don't care here */ |
103 /* some other error - we don't care here */ |
104 break; |
104 break; |
105 } |
105 } |
106 |
106 |
107 recvfrom(fd, buf, 1, 0, (struct sockaddr *)&sa, &addrlen); |
107 recvfrom(fd, buf, 1, 0, &sa.sa, &addrlen); |
108 got_icmp = JNI_TRUE; |
108 got_icmp = JNI_TRUE; |
109 } |
109 } |
110 |
110 |
111 return got_icmp; |
111 return got_icmp; |
112 } |
112 } |
120 SOCKETADDRESS sa; |
120 SOCKETADDRESS sa; |
121 int sa_len = sizeof(sa); |
121 int sa_len = sizeof(sa); |
122 |
122 |
123 memset(&sa, 0, sa_len); |
123 memset(&sa, 0, sa_len); |
124 |
124 |
125 rv = connect((SOCKET)fd, (struct sockaddr *)&sa, sa_len); |
125 rv = connect((SOCKET)fd, &sa.sa, sa_len); |
126 if (rv == SOCKET_ERROR) { |
126 if (rv == SOCKET_ERROR) { |
127 handleSocketError(env, WSAGetLastError()); |
127 handleSocketError(env, WSAGetLastError()); |
128 } else { |
128 } else { |
129 /* Disable WSAECONNRESET errors as socket is no longer connected */ |
129 /* Disable WSAECONNRESET errors as socket is no longer connected */ |
130 BOOL enable = FALSE; |
130 BOOL enable = FALSE; |
180 * and port in DatagramChannelImpl then we don't need to |
180 * and port in DatagramChannelImpl then we don't need to |
181 * create InetAddress and InetSocketAddress objects. |
181 * create InetAddress and InetSocketAddress objects. |
182 */ |
182 */ |
183 senderAddr = (*env)->GetObjectField(env, this, dci_senderAddrID); |
183 senderAddr = (*env)->GetObjectField(env, this, dci_senderAddrID); |
184 if (senderAddr != NULL) { |
184 if (senderAddr != NULL) { |
185 if (!NET_SockaddrEqualsInetAddress(env, (struct sockaddr *)&sa, |
185 if (!NET_SockaddrEqualsInetAddress(env, &sa, senderAddr)) { |
186 senderAddr)) { |
|
187 senderAddr = NULL; |
186 senderAddr = NULL; |
188 } else { |
187 } else { |
189 jint port = (*env)->GetIntField(env, this, dci_senderPortID); |
188 jint port = (*env)->GetIntField(env, this, dci_senderPortID); |
190 if (port != NET_GetPortFromSockaddr((struct sockaddr *)&sa)) { |
189 if (port != NET_GetPortFromSockaddr(&sa)) { |
191 senderAddr = NULL; |
190 senderAddr = NULL; |
192 } |
191 } |
193 } |
192 } |
194 } |
193 } |
195 if (senderAddr == NULL) { |
194 if (senderAddr == NULL) { |
196 jobject isa = NULL; |
195 jobject isa = NULL; |
197 int port; |
196 int port; |
198 jobject ia = NET_SockaddrToInetAddress(env, (struct sockaddr *)&sa, &port); |
197 jobject ia = NET_SockaddrToInetAddress(env, &sa, &port); |
199 if (ia != NULL) { |
198 if (ia != NULL) { |
200 isa = (*env)->NewObject(env, isa_class, isa_ctorID, ia, port); |
199 isa = (*env)->NewObject(env, isa_class, isa_ctorID, ia, port); |
201 } |
200 } |
202 CHECK_NULL_RETURN(isa, IOS_THROWN); |
201 CHECK_NULL_RETURN(isa, IOS_THROWN); |
203 |
202 |
204 // update cachedSenderInetAddress/cachedSenderPort |
203 // update cachedSenderInetAddress/cachedSenderPort |
205 (*env)->SetObjectField(env, this, dci_senderAddrID, ia); |
204 (*env)->SetObjectField(env, this, dci_senderAddrID, ia); |
206 (*env)->SetIntField(env, this, dci_senderPortID, |
205 (*env)->SetIntField(env, this, dci_senderPortID, |
207 NET_GetPortFromSockaddr((struct sockaddr *)&sa)); |
206 NET_GetPortFromSockaddr(&sa)); |
208 (*env)->SetObjectField(env, this, dci_senderID, isa); |
207 (*env)->SetObjectField(env, this, dci_senderID, isa); |
209 } |
208 } |
210 return n; |
209 return n; |
211 } |
210 } |
212 |
211 |
217 jobject destAddress, jint destPort) |
216 jobject destAddress, jint destPort) |
218 { |
217 { |
219 jint fd = fdval(env, fdo); |
218 jint fd = fdval(env, fdo); |
220 void *buf = (void *)jlong_to_ptr(address); |
219 void *buf = (void *)jlong_to_ptr(address); |
221 SOCKETADDRESS sa; |
220 SOCKETADDRESS sa; |
222 int sa_len; |
221 int sa_len = 0; |
223 jint rv = 0; |
222 jint rv = 0; |
224 |
223 |
225 if (NET_InetAddressToSockaddr(env, destAddress, destPort, |
224 if (NET_InetAddressToSockaddr(env, destAddress, destPort, &sa, |
226 (struct sockaddr *)&sa, |
225 &sa_len, preferIPv6) != 0) { |
227 &sa_len, preferIPv6) != 0) { |
|
228 return IOS_THROWN; |
226 return IOS_THROWN; |
229 } |
227 } |
230 |
228 |
231 rv = sendto((SOCKET)fd, |
229 rv = sendto((SOCKET)fd, buf, len, 0, &sa.sa, sa_len); |
232 buf, |
|
233 len, |
|
234 0, |
|
235 (struct sockaddr *)&sa, |
|
236 sa_len); |
|
237 if (rv == SOCKET_ERROR) { |
230 if (rv == SOCKET_ERROR) { |
238 int theErr = (jint)WSAGetLastError(); |
231 int theErr = (jint)WSAGetLastError(); |
239 if (theErr == WSAEWOULDBLOCK) { |
232 if (theErr == WSAEWOULDBLOCK) { |
240 return IOS_UNAVAILABLE; |
233 return IOS_UNAVAILABLE; |
241 } |
234 } |