android - 在 Android 中使用 LocalSocket 发送和接收 UDP

标签 android localsocket

我有一个使用这段代码打开 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 设计?

最佳答案

问题

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

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

  2. 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/

相关文章:

android - 在 Google TV 上的 Android Webview 中播放 YouTube 内容时出错

android - 使用 LocalServerSocket 时出现 "IOException: Try again"

android - 在 Android 中使用本地套接字将实时视频录制保存到 sd 卡 - 视频无法播放

linux - 无地址首次使用双向 unix 域套接字运行

android - 在 Android 中缓存数据的最佳方式

android - Eclipse 未检测到 Nexus 7 平板电脑进行调试

java - fragment 中的 AutoCompleteTextView 获取 NullPointerException

android - 在 Android 中使用 MediaRecorder 录制时使用 ffmpeg 处理视频