我有一个使用这段代码打开 UnixDomain 套接字的 native 应用程序。
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
错误
我也尝试绑定(bind)到同一个文件,但它显示 Address already in use
错误。
我可以将 LocalSocket 类用于 UDP 还是专为 TCP 设计?
最佳答案
问题
我发现您的代码有几个问题:
在您的 java 代码中,
LocalSocketAddress
默认为ABSTRACT
命名空间。但是,您的 native 应用程序会在LocalSocketAddress.Namespace.FILESYSTEM
命名空间中打开一个套接字。但是,出现“地址已在使用”错误意味着寻址有效;这可能表明尽管命名空间不正确,但您的地址仍然匹配。java代码没有将
SOCKET_DGRAM
类型传递给构造函数;这是 API 19 的新内容。
修复
地址空间
- 在创建
LocalSocketAddress
时指定FILESYSTEM
命名空间,或者 - 在 native 应用程序中,通过在抽象命名空间中添加一个
'\0'
NUL 字节来创建套接字。另请参阅:bind(2)
。
套接字类型
LocalSocket socket = new LocalSocket(SOCKET_DGRAM);
关于android - 在 Android 中使用 LocalSocket 发送和接收 UDP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17039366/