我有一个使用此代码打开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设计?
答案 0 :(得分:3)
我发现您的代码有几个问题:
在您的java代码中,LocalSocketAddress
默认为ABSTRACT
命名空间。但是,您的本机应用程序会在LocalSocketAddress.Namespace.FILESYSTEM
命名空间中打开一个套接字。但是,正在使用"地址已经在使用"错误意味着寻址有效;尽管命名空间不正确,但这可能表明您的地址匹配。
java代码没有将SOCKET_DGRAM
类型传递给构造函数;这是API 19的新内容。
FILESYSTEM
或LocalSocketAddress
命名空间
'\0'
NUL字节在抽象命名空间中创建套接字。另请参阅:bind(2)
。LocalSocket socket = new LocalSocket(SOCKET_DGRAM);
答案 1 :(得分:0)
如果要发送UDP数据包,则应使用java.net.DatagramSocket。 Here你可以找到一个小但很好的教程。