177 rv = NET_WinBind(fdval(env, fdo), &sa, sa_len, isExclBind);
178 if (rv == SOCKET_ERROR)
179 NET_ThrowNew(env, WSAGetLastError(), "bind");
180 }
181
182 JNIEXPORT void JNICALL
183 Java_sun_nio_ch_Net_listen(JNIEnv *env, jclass cl, jobject fdo, jint backlog)
184 {
185 if (listen(fdval(env,fdo), backlog) == SOCKET_ERROR) {
186 NET_ThrowNew(env, WSAGetLastError(), "listen");
187 }
188 }
189
190
191 JNIEXPORT jint JNICALL
192 Java_sun_nio_ch_Net_connect0(JNIEnv *env, jclass clazz, jboolean preferIPv6, jobject fdo,
193 jobject iao, jint port)
194 {
195 SOCKETADDRESS sa;
196 int rv;
197 int sa_len = 0;
198 SOCKET s = (SOCKET)fdval(env, fdo);
199
200 if (NET_InetAddressToSockaddr(env, iao, port, &sa, &sa_len, preferIPv6) != 0) {
201 return IOS_THROWN;
202 }
203
204 rv = connect(s, &sa.sa, sa_len);
205 if (rv != 0) {
206 int err = WSAGetLastError();
207 if (err == WSAEINPROGRESS || err == WSAEWOULDBLOCK) {
208 return IOS_UNAVAILABLE;
209 }
210 NET_ThrowNew(env, err, "connect");
211 return IOS_THROWN;
212 } else {
213 /* Enable WSAECONNRESET errors when a UDP socket is connected */
214 int type = 0, optlen = sizeof(type);
215 rv = getsockopt(s, SOL_SOCKET, SO_TYPE, (char*)&type, &optlen);
216 if (rv == 0 && type == SOCK_DGRAM) {
217 setConnectionReset(s, TRUE);
218 }
219 }
220 return 1;
221 }
222
223 JNIEXPORT jint JNICALL
224 Java_sun_nio_ch_Net_localPort(JNIEnv *env, jclass clazz, jobject fdo)
225 {
226 SOCKETADDRESS sa;
227 int sa_len = sizeof(sa);
228
229 if (getsockname(fdval(env, fdo), &sa.sa, &sa_len) < 0) {
230 int error = WSAGetLastError();
231 if (error == WSAEINVAL) {
232 return 0;
233 }
234 NET_ThrowNew(env, error, "getsockname");
235 return IOS_THROWN;
236 }
|
177 rv = NET_WinBind(fdval(env, fdo), &sa, sa_len, isExclBind);
178 if (rv == SOCKET_ERROR)
179 NET_ThrowNew(env, WSAGetLastError(), "bind");
180 }
181
182 JNIEXPORT void JNICALL
183 Java_sun_nio_ch_Net_listen(JNIEnv *env, jclass cl, jobject fdo, jint backlog)
184 {
185 if (listen(fdval(env,fdo), backlog) == SOCKET_ERROR) {
186 NET_ThrowNew(env, WSAGetLastError(), "listen");
187 }
188 }
189
190
191 JNIEXPORT jint JNICALL
192 Java_sun_nio_ch_Net_connect0(JNIEnv *env, jclass clazz, jboolean preferIPv6, jobject fdo,
193 jobject iao, jint port)
194 {
195 SOCKETADDRESS sa;
196 int rv;
197 int so_rv;
198 int sa_len = 0;
199 SOCKET s = (SOCKET)fdval(env, fdo);
200 int type = 0, optlen = sizeof(type);
201
202 if (NET_InetAddressToSockaddr(env, iao, port, &sa, &sa_len, preferIPv6) != 0) {
203 return IOS_THROWN;
204 }
205
206 so_rv = getsockopt(s, SOL_SOCKET, SO_TYPE, (char*)&type, &optlen);
207
208 /**
209 * Windows has a very long socket connect timeout of 2 seconds.
210 * If it's the loopback adapter we can shorten the wait interval.
211 */
212 if (so_rv == 0 && type == SOCK_STREAM && IS_LOOPBACK_ADDRESS(&sa)) {
213 NET_EnableFastTcpLoopbackConnect((jint)s);
214 }
215
216 rv = connect(s, &sa.sa, sa_len);
217 if (rv != 0) {
218 int err = WSAGetLastError();
219 if (err == WSAEINPROGRESS || err == WSAEWOULDBLOCK) {
220 return IOS_UNAVAILABLE;
221 }
222 NET_ThrowNew(env, err, "connect");
223 return IOS_THROWN;
224 } else {
225 /* Enable WSAECONNRESET errors when a UDP socket is connected */
226 if (so_rv == 0 && type == SOCK_DGRAM) {
227 setConnectionReset(s, TRUE);
228 }
229 }
230 return 1;
231 }
232
233 JNIEXPORT jint JNICALL
234 Java_sun_nio_ch_Net_localPort(JNIEnv *env, jclass clazz, jobject fdo)
235 {
236 SOCKETADDRESS sa;
237 int sa_len = sizeof(sa);
238
239 if (getsockname(fdval(env, fdo), &sa.sa, &sa_len) < 0) {
240 int error = WSAGetLastError();
241 if (error == WSAEINVAL) {
242 return 0;
243 }
244 NET_ThrowNew(env, error, "getsockname");
245 return IOS_THROWN;
246 }
|