Java如何处理底层套接字网络逻辑

时间:2019-04-01 11:22:10

标签: java sockets

请让我指出源代码,其中Java使用 [DllImport(WS2_32, SetLastError = true)]

处理Java的底层套接字网络逻辑

我试图了解Java如何使用DLLImport处理C#这样的底层网络逻辑。

很难找到java.net.Socket源代码中SocketImpl或SocketImplFactory逻辑的实现。即使我能够追溯到AbstractPlainSocketImpl.java的SocketImpl暗示,似乎也没有实现 connect0 进行更深入的研究。

1 个答案:

答案 0 :(得分:1)

您应查找java.net.SocketImpl之类的DualStackPlainSocketImpl的具体子类。

在某些地方实现调用本机函数:

connectResult = connect0(nativefd, address, port);
....
static native int connect0(int fd, InetAddress remote, int remotePort)
    throws IOException;

本机代码通常是特定于平台的,并由C ++或C实现。 来自DualStackPlainSocketImpl.c的OpenJDK / jdk8u的一个Windows示例:

JNIEXPORT jint JNICALL Java_java_net_DualStackPlainSocketImpl_connect0
  (JNIEnv *env, jclass clazz, jint fd, jobject iaObj, jint port) 
{
    SOCKETADDRESS sa;
    ...
    rv = connect(fd, (struct sockaddr *)&sa, sa_len);

在示例connnect()中,调用可能是您要查找的级别:Windows中的WinSock2 API call。在Linux来源中,您会发现类似的connnect()系统调用。