1

我有一个本机应用程序,它使用此代码打开一个 UnixDomain 套接字。

struct sockaddr_un local;
int len;
int fd;

fd = socket(AF_UNIX, SOCK_DGRAM, 0);

local.sun_family = AF_UNIX; 
strcpy(local.sun_path, "path.to.socket");

len = strlen(local.sun_path) + sizeof(local.sun_family);

bind(fd, (struct sockaddr*)&local, sizeof(local));

上面的代码正在运行,因为我可以看到套接字已创建。

现在我想从我用 Java 编写的 android 应用程序发送一个 UDP 数据包。我相信我需要使用 LocalSocket 类。问题是我不知道如何将 LocalSocket 类用于 UDP。我看到的所有教程都是针对 TCP(SOCK_STREAM) 的。

我尝试使用下面的代码连接到创建的套接字,但它们给了我错误

LocalSocket socket = new LocalSocket(); 
socket.connect(new LocalSocketAddress( "path.to.socket" ));

这给了我Connection refused错误

我也尝试绑定到同一个文件,但它显示Address already in use错误。

我可以将 LocalSocket 类用于 UDP 还是只为 TCP 设计?

4

2 回答 2

4

问题

我发现您的代码有几个问题:

  1. 在您的 java 代码中,LocalSocketAddress默认为ABSTRACT命名空间。但是,您的本机应用程序会在命名空间中打开一个套接字LocalSocketAddress.Namespace.FILESYSTEM。但是,获得“地址已在使用”错误意味着寻址有效;这可能表明您的地址匹配,尽管名称空间不正确。

  2. java代码没有将SOCKET_DGRAM类型传递给构造函数;这是 API 19 的新功能。

修复

地址空间

  • FILESYSTEM在创建时指定命名空间LocalSocketAddress,或
  • '\0'在本机应用程序中,通过添加NUL 字节在抽象命名空间中创建套接字。另见:bind(2)

插座类型

LocalSocket socket = new LocalSocket(SOCKET_DGRAM);
于 2014-06-26T12:33:54.233 回答
-1

如果你想发送 UDP 数据包,你应该使用 java.net.DatagramSocket。在这里你可以找到一个小而好的教程。

于 2013-06-11T08:22:03.683 回答