两个应用程序之间的原始套接字通信,一个在 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 方库来管理原始套接字。人们推荐 junixsocket
和 juds
,所以我想我会使用其中之一。
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)
.
我有一个用 c
编写的应用程序(充当服务器)正在侦听原始套接字,使用此套接字描述符:socket(AF_UNIX, SOCK_RAW, 0);
。 0 表示 IPPROTO_IP
我想在java中写一段代码(作为客户端)发送一个ip数据包到这个正在监听的原始套接字。现在我读到 java 需要第 3 方库来管理原始套接字。人们推荐 junixsocket
和 juds
,所以我想我会使用其中之一。
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)
.