Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法通过Windows 10和DLINK DIR-615路由器中的Java代码获取DNS请求_Java_Sockets_Networking_Dns - Fatal编程技术网

无法通过Windows 10和DLINK DIR-615路由器中的Java代码获取DNS请求

无法通过Windows 10和DLINK DIR-615路由器中的Java代码获取DNS请求,java,sockets,networking,dns,Java,Sockets,Networking,Dns,因此,我正在开发一个软件,该软件将监视(并可能通过充当Forrowder进行更改)我的路由器发出的所有DNS请求 我做了什么? 因此,首先我编写了一个Java代码,它可以侦听特定端口并将所有请求打印到控制台[现在我只想测试这些请求] 代码是: import java.net.*; import java.io.*; public class PortLogger{ public static void main(String[] args) { LoggerServer

因此,我正在开发一个软件,该软件将监视(并可能通过充当Forrowder进行更改)我的路由器发出的所有DNS请求

我做了什么?

因此,首先我编写了一个Java代码,它可以侦听特定端口并将所有请求打印到控制台[现在我只想测试这些请求]

代码是:

import java.net.*;
import java.io.*;

public class PortLogger{
    public static void main(String[] args) {
        LoggerServer loggerServer = new LoggerServer(53);
        loggerServer.start();
    }
}

class LoggerServer extends Thread{
    private int port;

    public LoggerServer(int port){
        this.port = port;
    }

    @Override
    public void run(){
        try{
            int id = 1;
            ServerSocket server = new ServerSocket(port);
            System.out.println("Server Listening at port " + port);
            Socket client;
            while(true){
                client = server.accept();
                ClientHandler clientHandler = new ClientHandler(client, id++);
                clientHandler.start();
            }
        }catch(Exception ex){
            System.out.println("Exception at Server : 1 :: EX = " + ex);
        }
    }
}

class ClientHandler extends Thread{
    private Socket client;
    private int id;

    public ClientHandler(Socket client, int id){
        this.client = client;
        this.id = id;
    }

    @Override
    public void run(){
        try {
            String data = "";
            BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
            while(true){
                data = reader.readLine();
                if(data.length() > 0){
                    System.out.println("Client : " + id + " :: " + data);
                }
            }
        }catch(Exception ex){
            System.out.println("Exception at Client : " + id + " :: EX = " + ex);
        }
    }
}
目前,该代码的唯一建议是向我显示向服务器发出的所有请求

我知道我还必须为此更改路由器中的DNS服务器

因此,我首先尝试通过进入internet设置,将我的计算机的本地IP作为DNS服务器

但它表明:

DNS IP和LAN IP必须位于不同的网络上

但我找到了另一种方法

详情如下:

我转到路由器的安装向导并将DNS服务器设置为相同的IP

令人惊讶的是,这起作用了

[我不知道这是否是D-Link固件中的错误

我还添加了一个例外,允许所有入站和出站请求都发送到端口53

有什么问题吗?

所以现在的问题是,即使在成功地将DNS更改为我的服务器之后。似乎根本没有对控制台的请求。我尝试了很多,但什么也没有

我通过自愿使用telnet向程序发送请求来检查程序是否正常工作

现在我做错了什么,或者路由器出现了一些错误(它是一个旧的)

注意:图片上的黑线只是为了隐藏我的公共IP地址,没有什么特别的


编辑:我又尝试了几次,然后发现当我在路由器中更改DNS时,网站没有打开,但控制台中仍然没有打开!

虽然很难给你一个完整的答案,为什么你的应用程序无法工作,但我可以建议一些调查方法:

  • 端口53是一个特权端口。这意味着在Linux上绑定到该端口需要根权限,如果以“普通”用户的身份执行,应用程序将由于“权限被拒绝”而引发异常。由于您正在使用Windows,我不知道如果您尝试以“普通”用户的身份绑定,或者您可能以管理员用户的身份执行,会发生什么(或Windows中与“root”等效的任何内容)你也不知道。它甚至可能只是默默地失败,也就是说,实际上它没有绑定,并且没有数据通过你的应用程序。顺便说一句,默认为“root”作为Linux中的默认执行用户是不正常的,因为这是不安全的,而且大多数Linux发行版(如果不是所有发行版)默认都不允许这样做,也就是说,你可以但你必须告诉发行版,这是你在安装过程中的意图。我将让你得出自己的结论,Windows对用户的“管理”持什么立场
  • 在这种情况下,如果是我,我会立即去一些网络工具看看发生了什么。在Linux上,这是
    tcpdump
    或Wireshark。你也可以使用Wireshark for Windows,因为它是一个GUI应用程序。这可以让你监视和过滤网络流量,因此与你的应用程序无关。你可以按源或目标地址和/或端口号排序
  • 我会将DNS设置单独留在路由器中,首先更改一台计算机中的DNS设置,称之为测试客户端,并将其DNS地址设置为运行应用程序的计算机。然后使用
    tcpdump
    或Wireshark,您可以在测试客户端上发出请求,例如浏览器请求,并查看产生的网络流量
  • 您从未提到在更改路由器的DNS设置后,来自客户端的所有浏览器请求是否都失败。这是我希望看到的,如果您的路由器无法再获得名称解析。但是,您的客户端中可能正在进行一些DNS缓存,因此您可能会在测试客户端上获得成功的DNS请求。再次查看网络流量或使用Linux客户端,这将为您提供更好的网络工具

  • 虽然很难给你一个完整的答案,为什么你的应用程序不起作用,但我可以建议一些调查方法:

  • 端口53是一个特权端口。这意味着在Linux上绑定到该端口需要根权限,如果以“普通”用户的身份执行,应用程序将由于“权限被拒绝”而引发异常。由于您正在使用Windows,我不知道如果您尝试以“普通”用户的身份绑定,或者您可能以管理员用户的身份执行,会发生什么(或Windows中与“root”等效的任何内容)你也不知道。它甚至可能只是默默地失败,也就是说,实际上它没有绑定,并且没有数据通过你的应用程序。顺便说一句,默认为“root”作为Linux中的默认执行用户是不正常的,因为这是不安全的,而且大多数Linux发行版(如果不是所有发行版)默认都不允许这样做,也就是说,你可以但你必须告诉发行版,这是你在安装过程中的意图。我将让你得出自己的结论,Windows对用户的“管理”持什么立场
  • 在这种情况下,如果是我,我会立即去一些网络工具看看发生了什么。在Linux上,这是
    tcpdump
    或Wireshark。你也可以使用Wireshark for Windows,因为它是一个GUI应用程序。这可以让你监视和过滤网络流量,因此与你的应用程序无关。你可以按源或目标地址和/或端口号排序
  • 我会将DNS设置单独留在路由器中,首先更改一台计算机中的DNS设置,称之为测试客户端,并将其DNS地址设置为运行应用程序的计算机。然后使用
    tcpdump
    或Wireshark,您可以在测试客户端上发出请求,例如浏览器请求,并查看产生的网络流量
  • 你从来没有提到如果在更改路由器的DNS之后