155 0,
156 &sa.sa,
157 &sa_len);
158
159 if (n == SOCKET_ERROR) {
160 int theErr = (jint)WSAGetLastError();
161 if (theErr == WSAEMSGSIZE) {
162 /* Spec says the rest of the data will be discarded... */
163 n = len;
164 } else if (theErr == WSAECONNRESET) {
165 purgeOutstandingICMP(env, this, fd);
166 if (connected == JNI_FALSE) {
167 retry = TRUE;
168 } else {
169 JNU_ThrowByName(env, JNU_JAVANETPKG "PortUnreachableException", 0);
170 return IOS_THROWN;
171 }
172 } else if (theErr == WSAEWOULDBLOCK) {
173 return IOS_UNAVAILABLE;
174 } else return handleSocketError(env, theErr);
175 }
176 } while (retry);
177
178 /*
179 * If the source address and port match the cached address
180 * and port in DatagramChannelImpl then we don't need to
181 * create InetAddress and InetSocketAddress objects.
182 */
183 senderAddr = (*env)->GetObjectField(env, this, dci_senderAddrID);
184 if (senderAddr != NULL) {
185 if (!NET_SockaddrEqualsInetAddress(env, &sa, senderAddr)) {
186 senderAddr = NULL;
187 } else {
188 jint port = (*env)->GetIntField(env, this, dci_senderPortID);
189 if (port != NET_GetPortFromSockaddr(&sa)) {
190 senderAddr = NULL;
191 }
192 }
193 }
194 if (senderAddr == NULL) {
217 {
218 jint fd = fdval(env, fdo);
219 void *buf = (void *)jlong_to_ptr(address);
220 SOCKETADDRESS sa;
221 int sa_len = 0;
222 jint rv = 0;
223
224 if (NET_InetAddressToSockaddr(env, destAddress, destPort, &sa,
225 &sa_len, preferIPv6) != 0) {
226 return IOS_THROWN;
227 }
228
229 rv = sendto((SOCKET)fd, buf, len, 0, &sa.sa, sa_len);
230 if (rv == SOCKET_ERROR) {
231 int theErr = (jint)WSAGetLastError();
232 if (theErr == WSAEWOULDBLOCK) {
233 return IOS_UNAVAILABLE;
234 }
235 return handleSocketError(env, (jint)WSAGetLastError());
236 }
237 return rv;
238 }
|
155 0,
156 &sa.sa,
157 &sa_len);
158
159 if (n == SOCKET_ERROR) {
160 int theErr = (jint)WSAGetLastError();
161 if (theErr == WSAEMSGSIZE) {
162 /* Spec says the rest of the data will be discarded... */
163 n = len;
164 } else if (theErr == WSAECONNRESET) {
165 purgeOutstandingICMP(env, this, fd);
166 if (connected == JNI_FALSE) {
167 retry = TRUE;
168 } else {
169 JNU_ThrowByName(env, JNU_JAVANETPKG "PortUnreachableException", 0);
170 return IOS_THROWN;
171 }
172 } else if (theErr == WSAEWOULDBLOCK) {
173 return IOS_UNAVAILABLE;
174 } else return handleSocketError(env, theErr);
175 } else if (n > 0) {
176 JVM_callNetworkReadBytes(env, n);
177 }
178 } while (retry);
179
180 /*
181 * If the source address and port match the cached address
182 * and port in DatagramChannelImpl then we don't need to
183 * create InetAddress and InetSocketAddress objects.
184 */
185 senderAddr = (*env)->GetObjectField(env, this, dci_senderAddrID);
186 if (senderAddr != NULL) {
187 if (!NET_SockaddrEqualsInetAddress(env, &sa, senderAddr)) {
188 senderAddr = NULL;
189 } else {
190 jint port = (*env)->GetIntField(env, this, dci_senderPortID);
191 if (port != NET_GetPortFromSockaddr(&sa)) {
192 senderAddr = NULL;
193 }
194 }
195 }
196 if (senderAddr == NULL) {
219 {
220 jint fd = fdval(env, fdo);
221 void *buf = (void *)jlong_to_ptr(address);
222 SOCKETADDRESS sa;
223 int sa_len = 0;
224 jint rv = 0;
225
226 if (NET_InetAddressToSockaddr(env, destAddress, destPort, &sa,
227 &sa_len, preferIPv6) != 0) {
228 return IOS_THROWN;
229 }
230
231 rv = sendto((SOCKET)fd, buf, len, 0, &sa.sa, sa_len);
232 if (rv == SOCKET_ERROR) {
233 int theErr = (jint)WSAGetLastError();
234 if (theErr == WSAEWOULDBLOCK) {
235 return IOS_UNAVAILABLE;
236 }
237 return handleSocketError(env, (jint)WSAGetLastError());
238 }
239
240 if (rv > 0) {
241 JVM_callFileWriteBytes(env, rv);
242 }
243
244 return rv;
245 }
|