【问题标题】:Read data directly from /dev/log Unix Domain Socket直接从 /dev/log Unix Domain Socket 读取数据
【发布时间】:2014-10-12 10:30:28
【问题描述】:

我的项目旨在直接从 Java 中的/dev/log UNIX 域套接字读取日志消息。目前我正在使用junixsocket。下面是从 unix 套接字读取的客户端示例代码。

import java.io.File;
import java.io.IOException;
import java.io.InputStream;

import org.newsclub.net.unix.AFUNIXSocket;
import org.newsclub.net.unix.AFUNIXSocketAddress;
import org.newsclub.net.unix.AFUNIXSocketException;

public class SimpleTestClient {
    public static void main(String[] args) throws IOException {
        final File socketFile = new File("/dev/log");

        AFUNIXSocket sock = AFUNIXSocket.newInstance();
        try {
            sock.connect(new AFUNIXSocketAddress(socketFile));
        } catch (AFUNIXSocketException e) {
            System.out.println("Cannot connect to server. Have you started it?\n");
            System.out.flush();
            throw e;
        }
        System.out.println("Connected");

        InputStream is = sock.getInputStream();

        byte[] buf = new byte[8192];

        int read = is.read(buf);
        System.out.println("Server says: " + new String(buf, 0, read));

        is.close();

        sock.close();

        System.out.println("End of communication.");
    }
}

上述代码无法连接到/dev/log。它抛出一个异常:

Cannot connect to server. Have you started it? Exception in thread "main" org.newsclub.net.unix.AFUNIXSocketException: Protocol wrong type for socket (socket: /dev/log) at org.newsclub.net.unix.NativeUnixSocket.connect(Native Method) at org.newsclub.net.unix.AFUNIXSocketImpl.connect(AFUNIXSocketImpl.java:125) at org.newsclub.net.unix.AFUNIXSocket.connect(AFUNIXSocket.java:97) at org.newsclub.net.unix.AFUNIXSocket.connect(AFUNIXSocket.java:87) at SimpleTestClient.main(SimpleTestClient.java:40)

我无法弄清楚如何解决这个问题。任何帮助都将不胜感激。

【问题讨论】:

  • 在try块中依赖代码成功的代码应该在同一个try块中。这里真正的问题是连接失败,而不是读取失败。您只是打印它并继续,就好像它没有发生一样。不要写这样的代码。
  • @EJP - 是的,我知道程序无法连接到 /dev/log 套接字。我的问题是为什么它无法连接到套接字?我做错了什么?
  • 错误信息询问“你开始了吗?”。答案是什么?

标签: java unix-socket


【解决方案1】:

由于您无法连接到日志跟踪中提到的现有服务器套接字,那么您还没有绑定一个提到的文件,因此请尝试创建一个 AF_UNIX 服务器套接字然后连接到它。

它可以在一个单独的类中完成:

public class DevLogServer {

  public static void main(String[] args) throws IOException {

    final File socketFile = new File("/dev/log");
    AFUNIXServerSocket server = AFUNIXServerSocket.newInstance();
    try {
      server.bind(new AFUNIXSocketAddress(socketFile));
    } catch (Exception e) {
      throw e;
    }

  }

}

根据@Ankit 评论编辑:

您可能还需要确保 syslod 守护程序已通过在终端窗口中运行以下命令停止:

sudo service syslog stop

您可能还需要对 /dev 目录授予大写权限。

【讨论】:

  • 但是 /dev/log 套接字不是一直在运行吗? swift.siphos.be/linux_sea/logfilemanagement.html
  • 我想补充几点: - 用户首先必须使用命令'sudo service syslog stop' 停止 syslod 守护进程 - 用户还需要更改 /dev 目录的权限,以便该程序能够在 /dev 目录中创建一个套接字。
  • 在主要答案中添加了注释以获得更多可见性:)
猜你喜欢
  • 2016-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-02
  • 1970-01-01
  • 2021-03-26
  • 1970-01-01
相关资源
最近更新 更多