JNIEXPORT jint JNICALL Java_sun_nio_ch_Net_connect0(JNIEnv *env, jclass clazz, jboolean preferIPv6, jobject fdo, jobject iao, jint port) { SOCKETADDRESS sa; int rv; int sa_len; SOCKET s = (SOCKET)fdval(env, fdo); if (NET_InetAddressToSockaddr(env, iao, port, (struct sockaddr *)&sa, &sa_len, preferIPv6) != 0) { return IOS_THROWN; } rv = connect(s, (struct sockaddr *)&sa, sa_len); if (rv != 0) { int err = WSAGetLastError(); if (err == WSAEINPROGRESS || err == WSAEWOULDBLOCK) { return IOS_UNAVAILABLE; } NET_ThrowNew(env, err, "connect"); return IOS_THROWN; } else { /* Enable WSAECONNRESET errors when a UDP socket is connected */ int type = 0, optlen = sizeof(type); rv = getsockopt(s, SOL_SOCKET, SO_TYPE, (char*)&type, &optlen); if (rv == 0 && type == SOCK_DGRAM) { setConnectionReset(s, TRUE); } } return 1; }
void NetworkSocket::setupBehavior() { setBlocking(false); setConnectionReset(false); //setBroadCasting(true); setReUseAddress(true); }
JNIEXPORT jint JNICALL Java_sun_nio_ch_Net_socket0(JNIEnv *env, jclass cl, jboolean preferIPv6, jboolean stream, jboolean reuse) { SOCKET s; int domain = (preferIPv6) ? AF_INET6 : AF_INET; s = socket(domain, (stream ? SOCK_STREAM : SOCK_DGRAM), 0); if (s != INVALID_SOCKET) { SetHandleInformation((HANDLE)s, HANDLE_FLAG_INHERIT, 0); /* IPV6_V6ONLY is true by default */ if (domain == AF_INET6) { int opt = 0; setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, (const char *)&opt, sizeof(opt)); } /* Disable WSAECONNRESET errors for initially unconnected UDP sockets */ if (!stream) { setConnectionReset(s, FALSE); } } else { NET_ThrowNew(env, WSAGetLastError(), "socket"); } return (jint)s; }