【问题标题】:raw socket communication between two applications one in c and one in java两个应用程序之间的原始套接字通信,一个在 c 中,一个在 java 中
【发布时间】:2016-01-06 16:41:13
【问题描述】:

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

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

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

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

所以问题是:

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

谢谢

【问题讨论】:

  • socketfilename 是什么意思?您的意思是 URL 吗,例如创建套接字客户端所需的 localhost:8080ip-address:port
  • 我编辑了问题以回答您的评论

标签: java c raw-sockets


【解决方案1】:

您正在使用 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)

【讨论】:

  • 不不,我不想要互联网上的原始套接字。我希望它在同一台机器上的本地。你能告诉我一个如何在相同的文件系统路径名上定义两个套接字以进行寻址的示例吗?
猜你喜欢
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 2016-07-27
  • 2015-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多