Чтение данных непосредственно из /dev/log доменного сокета Unix

Мой проект направлен на чтение сообщений журнала непосредственно из доменного сокета /dev/log UNIX в Java. В настоящее время я использую 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)

Я не могу понять, как решить эту проблему. Любая помощь будет ценной.


person Ankit    schedule 12.10.2014    source источник
comment
Код, который зависит от успеха кода в блоке try, должен находиться в том же блоке try. Настоящая проблема здесь заключается в сбое соединения, а не в сбое чтения. Вы просто распечатали его и продолжили, как будто его и не было. Не пишите такой код.   -  person user207421    schedule 12.10.2014
comment
@EJP - Да, я понимаю, что программа не может подключиться к сокету /dev/log. Мой вопрос: почему он не может подключиться к розетке? Что я делаю не так?   -  person Ankit    schedule 12.10.2014
comment
Сообщение об ошибке спрашивает: «Вы начали это?». Какой ответ?   -  person user207421    schedule 19.11.2019


Ответы (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.

person tmarwen    schedule 12.10.2014
comment
Но разве сокет /dev/log не всегда активен? swift.siphos.be/linux_sea/logfilemanagement.html - person Ankit; 12.10.2014
comment
Я хотел бы добавить еще несколько моментов: - Сначала пользователь должен остановить демона syslod с помощью команды «sudo service syslog stop» - Пользователю также необходимо изменить разрешения каталога /dev, чтобы программа могла создать сокет внутри каталога /dev. - person Ankit; 09.11.2014
comment
Добавил примечания к основному ответу, чтобы сделать его более заметным :) - person tmarwen; 10.11.2014