两个应用程序之间的原始套接字通信,一个在 c 中,一个在 java 中

raw socket communication between two applications one in c and one in java

我有一个用 c 编写的应用程序(充当服务器)正在侦听原始套接字,使用此套接字描述符:socket(AF_UNIX, SOCK_RAW, 0);。 0 表示 IPPROTO_IP

我想在java中写一段代码(作为客户端)发送一个ip数据包到这个正在监听的原始套接字。现在我读到 java 需要第 3 方库来管理原始套接字。人们推荐 junixsocketjuds,所以我想我会使用其中之一。

Junixsocket 做这样的事情来定义原始套接字:

File socketFile = new File("/path/to/your/socket");
AFUNIXSocket sock = AFUNIXSocket.newInstance();
sock.connect(new AFUNIXSocketAddress(socketFile));

所以问题是:

是否可以让这两个应用程序通过这个原始套接字相互通信?在 java 中,您需要建立套接字文件名和路径,而在 c 中,这不是强制性的。我的 C 代码没有指定套接字文件名或路径,所以我不知道如何让它们在同一个套接字上进行通信。我如何确保它们都 sending/receiving 在同一个原始套接字上?所有这些通信都只发生在本地!

谢谢

您正在使用 unix 域套接字 (AF_UNIX)。它们是为同一内核上的进程 运行 有效设计的,并使用 文件系统路径名来寻址 (有关详细信息,请参阅 man 4 unix)。所以你必须在两个进程之间共享一个路径名。

按要求编辑:

要在 C 应用程序中设置 unix 域套接字,您需要一个类型为 sockaddr_un 的地址,并用您的套接字路径填充其 sun_path 成员:

    sockaddr_un sockaddr;
    memset(&sockaddr, 0, sizeof(sockaddr));
    sockaddr.sun_family = AF_UNIX;
    strncpy(sockaddr.sun_path, "/path/to/your/socket", UNIX_MAX_PATH);

并且 bind()connect() 您的套接字到此 sockaddr

不过,与SOCK_RAW无关。如果我错了请纠正我,但你想要一个通过 Internet 的原始套接字,即 socket(AF_INET, SOCK_RAW, 0).