142 retry = JNI_FALSE;
143 n = recvfrom(fd, buf, len, 0, &sa.sa, &sa_len);
144 if (n < 0) {
145 if (errno == EAGAIN || errno == EWOULDBLOCK) {
146 return IOS_UNAVAILABLE;
147 }
148 if (errno == EINTR) {
149 return IOS_INTERRUPTED;
150 }
151 if (errno == ECONNREFUSED) {
152 if (connected == JNI_FALSE) {
153 retry = JNI_TRUE;
154 } else {
155 JNU_ThrowByName(env, JNU_JAVANETPKG
156 "PortUnreachableException", 0);
157 return IOS_THROWN;
158 }
159 } else {
160 return handleSocketError(env, errno);
161 }
162 }
163 } while (retry == JNI_TRUE);
164
165 /*
166 * If the source address and port match the cached address
167 * and port in DatagramChannelImpl then we don't need to
168 * create InetAddress and InetSocketAddress objects.
169 */
170 senderAddr = (*env)->GetObjectField(env, this, dci_senderAddrID);
171 if (senderAddr != NULL) {
172 if (!NET_SockaddrEqualsInetAddress(env, &sa, senderAddr)) {
173 senderAddr = NULL;
174 } else {
175 jint port = (*env)->GetIntField(env, this, dci_senderPortID);
176 if (port != NET_GetPortFromSockaddr(&sa)) {
177 senderAddr = NULL;
178 }
179 }
180 }
181 if (senderAddr == NULL) {
211 }
212
213 if (NET_InetAddressToSockaddr(env, destAddress, destPort, &sa,
214 &sa_len, preferIPv6) != 0) {
215 return IOS_THROWN;
216 }
217
218 n = sendto(fd, buf, len, 0, &sa.sa, sa_len);
219 if (n < 0) {
220 if (errno == EAGAIN || errno == EWOULDBLOCK) {
221 return IOS_UNAVAILABLE;
222 }
223 if (errno == EINTR) {
224 return IOS_INTERRUPTED;
225 }
226 if (errno == ECONNREFUSED) {
227 JNU_ThrowByName(env, JNU_JAVANETPKG "PortUnreachableException", 0);
228 return IOS_THROWN;
229 }
230 return handleSocketError(env, errno);
231 }
232 return n;
233 }
|
142 retry = JNI_FALSE;
143 n = recvfrom(fd, buf, len, 0, &sa.sa, &sa_len);
144 if (n < 0) {
145 if (errno == EAGAIN || errno == EWOULDBLOCK) {
146 return IOS_UNAVAILABLE;
147 }
148 if (errno == EINTR) {
149 return IOS_INTERRUPTED;
150 }
151 if (errno == ECONNREFUSED) {
152 if (connected == JNI_FALSE) {
153 retry = JNI_TRUE;
154 } else {
155 JNU_ThrowByName(env, JNU_JAVANETPKG
156 "PortUnreachableException", 0);
157 return IOS_THROWN;
158 }
159 } else {
160 return handleSocketError(env, errno);
161 }
162 } else if (n > 0) {
163 JVM_callNetworkReadBytes(env, n);
164 }
165 } while (retry == JNI_TRUE);
166
167 /*
168 * If the source address and port match the cached address
169 * and port in DatagramChannelImpl then we don't need to
170 * create InetAddress and InetSocketAddress objects.
171 */
172 senderAddr = (*env)->GetObjectField(env, this, dci_senderAddrID);
173 if (senderAddr != NULL) {
174 if (!NET_SockaddrEqualsInetAddress(env, &sa, senderAddr)) {
175 senderAddr = NULL;
176 } else {
177 jint port = (*env)->GetIntField(env, this, dci_senderPortID);
178 if (port != NET_GetPortFromSockaddr(&sa)) {
179 senderAddr = NULL;
180 }
181 }
182 }
183 if (senderAddr == NULL) {
213 }
214
215 if (NET_InetAddressToSockaddr(env, destAddress, destPort, &sa,
216 &sa_len, preferIPv6) != 0) {
217 return IOS_THROWN;
218 }
219
220 n = sendto(fd, buf, len, 0, &sa.sa, sa_len);
221 if (n < 0) {
222 if (errno == EAGAIN || errno == EWOULDBLOCK) {
223 return IOS_UNAVAILABLE;
224 }
225 if (errno == EINTR) {
226 return IOS_INTERRUPTED;
227 }
228 if (errno == ECONNREFUSED) {
229 JNU_ThrowByName(env, JNU_JAVANETPKG "PortUnreachableException", 0);
230 return IOS_THROWN;
231 }
232 return handleSocketError(env, errno);
233 } else if (n > 0) {
234 JVM_callNetworkWriteBytes(env, n);
235 }
236 return n;
237 }
|