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

时间:2013-06-11 08:14:06

标签: android localsocket

我有一个使用此代码打开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类。问题是我不知道如何使用UDP的LocalSocket类。我看到的所有教程都是针对TCP(SOCK_STREAM)。

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

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

这给了我Connection refused错误

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

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

2 个答案:

答案 0 :(得分:3)

问题

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

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

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

  3. 修复

    地址空间

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

    套接字类型

    LocalSocket socket = new LocalSocket(SOCKET_DGRAM);
    

答案 1 :(得分:0)

如果要发送UDP数据包,则应使用java.net.DatagramSocket。 Here你可以找到一个小但很好的教程。