예제 #1
0
파일: JNIHelpers.cpp 프로젝트: b-cuts/UDT
// NOTE: ipv4 only
int X_ConvertInetSocketAddressToSockaddr( //
		JNIEnv* env, //
		jobject objInetSocketAddress, //
		sockaddr* sockAddr //
		) {

	CHK_NUL_RET_ERR(env, "env");
	CHK_NUL_RET_ERR(sockAddr, "sockAddr");
	CHK_NUL_RET_ERR(objInetSocketAddress, "objInetSocketAddress");

	const jobject objInetAddress = env->CallObjectMethod(objInetSocketAddress,
			jdk_InetSocketAddress_getAddress);
	CHK_NUL_RET_ERR(objInetAddress, "objInetAddress");

	jint address = 0;
	jint port = env->CallIntMethod(objInetSocketAddress,
			jdk_InetSocketAddress_getPort);

	const int rv = X_ConvertInetAddressToInteger(env, objInetAddress, &address);
	if (rv == JNI_ERR) {
		return JNI_ERR;
	}

	sockaddr_in* sockAddrIn = (sockaddr_in*) sockAddr;

	sockAddrIn->sin_addr.s_addr = htonl(address);
	sockAddrIn->sin_port = htons(port);

	return JNI_OK;

}
예제 #2
0
// NOTE: ipv4 only
int X_InitSockAddr(sockaddr* sockAddr) {
    CHK_NUL_RET_ERR(sockAddr, "sockAddr");
    sockaddr_in* sockAddrIn = (sockaddr_in*) sockAddr;
    sockAddrIn->sin_family = AF_INET;
    memset(&(sockAddrIn->sin_zero), '\0', 8);
    return JNI_OK;
}
예제 #3
0
파일: JNIHelpers.cpp 프로젝트: b-cuts/UDT
// NOTE: ipv4 only
int X_ConvertInetAddressToInteger( //
		JNIEnv* env, //
		jobject objInetAddress, //
		jint* address //
		) {

	CHK_NUL_RET_ERR(env, "env");
	CHK_NUL_RET_ERR(objInetAddress, "objInetAddress");
	CHK_NUL_RET_ERR(address, "address");

	const jbyteArray objArray = (jbyteArray) env->CallObjectMethod(
			objInetAddress, jdk_InetAddress_getAddress);
	CHK_NUL_RET_ERR(objArray, "objArray");

	const int sizeArray = env->GetArrayLength(objArray);

	switch (sizeArray) {
	case 4:
		// IPV4
		break;
	case 16:
		// IPV6
	default:
		CHK_LOG("unsupported address size", "sizeArray");
		return JNI_ERR;
	}

	jbyte* refArray = env->GetByteArrayElements(objArray, NULL);

	int value = 0;
	value |= (0xFF000000 & (refArray[0] << 24));
	value |= (0x00FF0000 & (refArray[1] << 16));
	value |= (0x0000FF00 & (refArray[2] << 8));
	value |= (0x000000FF & (refArray[3]));

	env->ReleaseByteArrayElements(objArray, refArray, 0);

	*address = value;

	return JNI_OK;

}
예제 #4
0
// NOTE: ipv4 only
int X_ConvertSockaddrToInetSocketAddress(JNIEnv* env, sockaddr* sockAddr,
        jobject objInetSocketAddress) {

    CHK_NUL_RET_ERR(env, "env");
    CHK_NUL_RET_ERR(sockAddr, "sockAddr");
    CHK_NUL_RET_ERR(objInetSocketAddress, "objInetSocketAddress");

    jobject objInetAddress = env->GetObjectField(objInetSocketAddress,
                             isa_InetAddressID);
    CHK_NUL_RET_ERR(objInetAddress, "objInetAddress");

    sockaddr_in* sockAddrIn = (sockaddr_in*) sockAddr;

    jint address = ntohl(sockAddrIn->sin_addr.s_addr);
    jint port = ntohs(sockAddrIn->sin_port);

    env->SetIntField(objInetAddress, ia_AddressID, address);
    env->SetIntField(objInetSocketAddress, isa_PortID, port);

    return JNI_OK;

}
예제 #5
0
// NOTE: ipv4 only
int X_ConvertInetSocketAddressToSockaddr(JNIEnv* env,
        jobject objInetSocketAddress, sockaddr* sockAddr) {

    CHK_NUL_RET_ERR(env, "env");
    CHK_NUL_RET_ERR(sockAddr, "sockAddr");
    CHK_NUL_RET_ERR(objInetSocketAddress, "objInetSocketAddress");

    jobject objInetAddress = env->GetObjectField(objInetSocketAddress,
                             isa_InetAddressID);
    CHK_NUL_RET_ERR(objInetAddress, "objInetAddress");

    jint address = env->GetIntField(objInetAddress, ia_AddressID);
    jint port = env->GetIntField(objInetSocketAddress, isa_PortID);

    sockaddr_in* sockAddrIn = (sockaddr_in*) sockAddr;

    sockAddrIn->sin_addr.s_addr = htonl(address);
    sockAddrIn->sin_port = htons(port); // msvc C4244

    return JNI_OK;

}
예제 #6
0
// NOTE: ipv4 only
int X_ConvertInetSocketAddressToSockaddr(JNIEnv* env,
		jobject objInetSocketAddress, sockaddr* sockAddr) {

	CHK_NUL_RET_ERR(env, "env");
	CHK_NUL_RET_ERR(sockAddr, "sockAddr");
	CHK_NUL_RET_ERR(objInetSocketAddress, "objInetSocketAddress");

	jobject objInetAddress = env->CallObjectMethod(objInetSocketAddress,
			jdk_clsInetSocketAddress_getAddressID);
	CHK_NUL_RET_ERR(objInetAddress, "objInetAddress");

	// FIXME private field access
	jint address = env->GetIntField(objInetAddress, ia_AddressID);
	jint port = env->CallIntMethod(objInetSocketAddress,
			jdk_clsInetSocketAddress_getPortID);

	sockaddr_in* sockAddrIn = (sockaddr_in*) sockAddr;

	sockAddrIn->sin_addr.s_addr = htonl(address);
	sockAddrIn->sin_port = htons(port); // msvc C4244

	return JNI_OK;

}
예제 #7
0
파일: JNIHelpers.cpp 프로젝트: b-cuts/UDT
bool X_IsSockaddrEqualsInetSocketAddress( //
		JNIEnv* env, //
		sockaddr* sockAddr, //
		jobject objSocketAddress //
		) {

	CHK_NUL_RET_FLS(env, "env");
	CHK_NUL_RET_FLS(sockAddr, "sockAddr");
	CHK_NUL_RET_FLS(objSocketAddress, "objSocketAddress");

	sockaddr_in* sockAddrIn = (sockaddr_in*) sockAddr;

	jint address1 = ntohl(sockAddrIn->sin_addr.s_addr);
	jint port1 = ntohs(sockAddrIn->sin_port);

	jint address2 = 0;
	jint port2 = env->CallIntMethod(objSocketAddress,
			jdk_InetSocketAddress_getPort);

	jobject objInetAddress = env->CallObjectMethod(objSocketAddress,
			jdk_InetSocketAddress_getAddress);
	CHK_NUL_RET_ERR(objInetAddress, "objInetAddress");

	const int rv = X_ConvertInetAddressToInteger(env, objInetAddress,
			&address2);
	if (rv == JNI_ERR) {
		return false;
	}

	if (address1 == address2 && port1 == port2) {
		return true;
	}

	return false;

}