IP地址与端口概念

  • IP地址

    在网络中每台计算机都必须有一个的IP地址; 
    32位,4个字节,常用点分十进制的格式表示,例如:192.168.1.100 
    127.0.0.1 是固定ip地址,代表当前计算机,相当于面向对象里的 "this"



  • 端口

    两台计算机进行连接,总有一台服务器,一台客户端。
    服务器和客户端之间的通信通过端口进行。如图:


    ip地址是 192.168.1.100的服务器通过端口 8080
    与ip地址是192.168.1.189的客户端 的1087端口通信

  • 获取本机IP地址


    package socket;
     
    import java.net.InetAddress;
    import java.net.UnknownHostException;
     
    public class TestSocket {
     
        public static void main(String[] args) throws UnknownHostException {
            InetAddress host = InetAddress.getLocalHost();
            String ip =host.getHostAddress();
            System.out.println("本机ip地址:" + ip);
        }
    }
  • ping命令

    使用ping判断一个地址是否能够到达
    ping不是java的api,是windows中的一个小工具,用于判断一个地址的相应时间


    如图
    ping 192.168.2.106 可以返回这个地址的响应时间 time<1ms表示很快,局域网一般就是这个响应时间


    ping 192.168.2.206 返回Request timed out表示时间较久都没有响应返回,基本判断这个地址不可用



  • 使用java 执行ping命令

    借助 Runtime.getRuntime().exec() 可以运行一个windows的exe程序
    如图,使用java运行 ping 192.168.2.106,返回这样的字符串

    package socket;
     
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
     
    public class TestSocket {
     
        public static void main(String[] args) throws IOException {
     
            Process p = Runtime.getRuntime().exec("ping " + "192.168.2.106");
            BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
            String line = null;
            StringBuilder sb = new StringBuilder();
            while ((line = br.readLine()) != null) {
                if (line.length() != 0)
                    sb.append(line + "\r\n");
            }
            System.out.println("本次指令返回的消息是:");
            System.out.println(sb.toString());
        }
     
    }
  • 判断本网段有多少可用的ip地址

    首先获取 获取本机IP地址,比如说是192.168.2.100。 那么本网段的ip地址就是从 192.168.2.1 到 192.168.2.255
    再通过使用java 执行ping命令 判断这些ip地址能否使用,把能够使用的ip打印出来



    为了提高效率,使用多线程方式同时ping。 但是如果开启255个线程,又会因为网络端口太拥挤,会被判定为无法ping通。
    所以本例使用java自带线程池,线程池的连接数还不能太大,启动了15个线程。 

    等待所有的线程结束后打印出ping通了的ip地址。

    package socket;
        
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.InetAddress;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    import java.util.concurrent.LinkedBlockingQueue;
    import java.util.concurrent.ThreadPoolExecutor;
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.atomic.AtomicInteger;
        
    public class TestSocket {
        
        public static void main(String[] args) throws IOException, InterruptedException {
            InetAddress host = InetAddress.getLocalHost();
            String ip = host.getHostAddress();
            String ipRange = ip.substring(0, ip.lastIndexOf('.'));
            System.out.println("本机ip地址:" + ip);
            System.out.println("网段是: " + ipRange);
        
            List<String> ips = Collections.synchronizedList(new ArrayList<>());
            ThreadPoolExecutor threadPool = new ThreadPoolExecutor(10, 15, 60, TimeUnit.SECONDS,
                    new LinkedBlockingQueue<Runnable>());
            AtomicInteger number = new AtomicInteger();
            for (int i = 0; i < 255; i++) {
                String testIP = ipRange + "." + (i + 1);
                threadPool.execute(new Runnable() {
                    @Override
                    public void run() {
                        boolean reachable = isReachable(testIP);
                        if (reachable)
                            // System.out.println("找到可连接的ip地址:" + testIP);
                            ips.add(testIP);
        
                        synchronized (number) {
                            System.out.println("已经完成:" + number.incrementAndGet() + " 个 ip 测试");
                        }
                    }
        
                });
        
            }
        
            // 等待所有线程结束的时候,就关闭线程池
            threadPool.shutdown();
            //等待线程池关闭,但是最多等待1个消失
            if (threadPool.awaitTermination(1, TimeUnit.HOURS)) {
                System.out.println("如下ip地址可以连接");
                for (String theip : ips) {
                    System.out.println(theip);
                }
                System.out.println("总共有:" + ips.size() + " 个地址");
        
            }
        }
        
        private static boolean isReachable(String ip) {
            try {
                boolean reachable = false;
        
                Process p = Runtime.getRuntime().exec("ping -n 1 " + ip);
                BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
                String line = null;
                StringBuilder sb = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    if (line.length() != 0)
                        sb.append(line + "\r\n");
                }
        
                //当有TTL出现的时候,就表示连通了
                reachable = sb.toString().contains("TTL");
                br.close();
                return reachable;
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                return false;
            }
        }
        
    }


  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
端口扫描软件的代码在网上很多,可是并不一定适合基础不深的鸟鸟们学。要不就是代码大多都很长而且使用了多线程(关于多线程的很多概念就够闹腾的了,扫描部分就更算了),让我等小菜都望而生畏;要不就是速度很慢,学会了也派不上用场。今天我就介绍一下自己学习winsock后写的端口扫描软件吧! 端口扫描软件的基本思路就不说了,没有什么很难的算法,大家想想就应该知道的,只要从起始端口到结尾端口都遍历一遍,找到打开的端口输出就可以了。大体的就是这个样子:for(CurrPort=StartPort;CurrPort<=EndPort;CurrPort++) {scan的执行体; }。这个软件没有使用到多线程技术,也就不用考虑那么多的关于多线程的概念了。因此我们的这个扫描软件从两个方面来讨论,第一方面是如何可以找到打开的端口,第二方面是如何提高扫描端口的速度。 一、找到打开的端口 在介绍如何找到打开的端口以前,让我们先来认识一个函数——connect()。connect函数将一个流套接字连接到指定IP地址的指定端口上。connect函数的用法:int connect(SOCKET s,const struct sockaddr FAR* name,int namelen);参数s指定用于连接的套接字句柄,name参数指向一个sockaddr_in结构,用来指定要连接到的服务器的IP地址端口,namelen参数则指定sockaddr_in结构的长度。这个参数连接成功的时候,函数返回0,否则返回值是SOCKET_ERROR。connect函数的用法大体我们就说这么多了。说到这里大家应该想到了吧?我们用connect函数的返回值进行判断,找到打开的端口号。好,看下具体的代码,有详细的注释,如果对函数不明白可以到MSDN或网上查询。 int scan(char *Ip, int StartPort, int EndPort) { clock_t StartTime,EndTime; //扫描的开始时间和结束时间 float CostTime; //扫描过程中耗费的时间 WSADATA wsa; SOCKET s; struct sockaddr_in server; int CurrPort; //当前端口 int ret; WSAStartup(MAKEWORD(2,2),&wsa); //使用winsock函数之前,必须用WSAStartup函数来装入并初始化动态连接库 server.sin_family=AF_INET; //指定地址格式,在winsock中只能使用AF_INET server.sin_addr.s_addr=inet_addr(Ip); //指定被扫描的IP地址 StartTime=clock(); for(CurrPort=StartPort;CurrPort<=EndPort;CurrPort++) { s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); //创建套接字 /* SOCKET socket(int af,int type,int protocol); 为通信连接创建一个套接字 af参数: 指定套接字地址格式,在winsock中只能使用AF_INET type参数: 套接字类型,这里使用了SOCK_STREAM,流套接字 protocol参数:配合type使用,指定协议类型,这里使用IPPROTO_TCP(就是TCP协议) */ server.sin_port=htons(CurrPort); //指定被扫描IP地址端口号 ret=connect(s,(struct sockaddr *)&server,sizeof(server)); //连接 if(0==ret) //判断连接是否成功 { printf("%s:%d\n",Ip,CurrPort); closesocket(s); } } EndTime=clock(); CostTime=(float)(EndTime-StartTime)/CLOCKS_PER_SEC; printf("Cost time:%f second\n",CostTime); //输出扫描过程中耗费的时间 WSACleanup(); //释放动态连接库并释放被创建的套接字 return 1; }
如何查询端口用及停止程序的方被占法 收藏 端口如果被其他程序占用就不能正常启动,比如有时启动时会提示WEB启动失败,其实就是80端口被占用了,而迅雷等下载软件恰恰就是占用了80端口,关掉就行了。但有时迅雷等都没有开也启动不了,那就是别的东西占用了,那怎么办呢?我来叫你查看端口并关掉的方法。 1.在开始--运行 里面输入cmd点回车,会出现运行窗口。 2.在提示符后输入netstat -ano回车,找到tcp 80端口对应的pid,比如1484. -a 表示显示所有活动的TCP连接以及计算机监听的TCP和UDP端口。 -e 表示显示以太网发送和接收的字节数、数据包数等。 -n 表示只以数字形式显示所有活动的TCP连接的地址和端口号。 -o 表示显示活动的TCP连接并包括每个连接的进程ID(PID)。 -s 表示按协议显示各种连接的统计信息,包括端口号。 3.ctrl+alt+del打开任务管理器,选进程,这里有很多正在运行的程序怎么找? 查看--选择列--在PID(进程标示符)前面打钩。好了,下面的进程前面都有了PID号码。这时上一步找到的PID就有用了,找到1484,比如PEER.EXE什么的,结束进程吧。这时再开服务器,看WEB可以启动了! 关闭/开启端口 在介绍各种端口的作用前,这里先介绍一下在Windows中如何关闭/打开端口,因为默认的情况下,有很多不安全的或没有什么用的端口是开启的,比如Telnet服务的23端口、FTP服务的21端口、SMTP服务的25端口、RPC服务的135端口等等。为了保证系统的安全性,我们可以通过下面的方法来关闭/开启端口。 【附:】 关闭端口 比如在Windows 2000/XP中关闭SMTP服务的25端口,可以这样做:首先打开“控制面板”,双击“管理工具”,再双击“服务”。接着在打开的服务窗口中找到并双击“Simple Mail Transfer Protocol (SMTP)”服务,单击“停止”按钮来停止该服务,然后在“启动类型”中选择“已禁用”,最后单击“确定”按钮即可。这样,关闭了SMTP服务就相当于关闭了对应的端口。 开启端口 如果要开启该端口只要先在“启动类型”选择“自动”,单击“确定”按钮,再打开该服务,在“服务状态”中单击“启动”按钮即可启用该端口,最后,单击“确定”按钮即可。 21端口:21端口主要用于FTP(File Transfer Protocol,文件传输协议)服务。 23端口:23端口主要用于Telnet(远程登录)服务,是Internet上普遍采用的登录和仿真程序。 25端口:25端口为SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)服务器所开放,主要用于发送邮件,如今绝大多数邮件服务器都使用该协议。 53端口:53端口为DNS(Domain Name Server,域名服务器)服务器所开放,主要用于域名解析,DNS服务在NT系统中使用的最为广泛。 67、68端口:67、68端口分别是为Bootp服务的Bootstrap Protocol Server(引导程序协议服务端)和Bootstrap Protocol Client(引导程序协议客户端)开放的端口。 69端口:TFTP是Cisco公司开发的一个简单文件传输协议,类似于FTP。 79端口:79端口是为Finger服务开放的,主要用于查询远程主机在线用户、操作系统类型以及是否缓冲区溢出等用户的详细信息。 80端口: 80端口:是为HTTP(超文本传输协议)开放的,这是上网冲浪使用最多的协议,主要用于在WWW(World Wide Web,万维网)服务上传输信息的协议。 99端口:99端口是用于一个名为“Metagram Relay”(亚对策延时)的服务,该服务比较少见,一般是用不到的。 109、110端口:109端口是为POP2(Post Office Protocol Version 2,邮局协议2)服务开放的,110端口是为POP3(邮件协议3)服务开放的,POP2、POP3都是主要用于接收邮件的。 111端口:111端口是SUN公司的RPC(Remote Procedure Call,远程过程调用)服务所开放的端口,主要用于分布式系统中不同计算机的内部进程通信,RPC在多种网络服务中都是很重要的组件。 113端口:113端口主要用于Windows的“Authentication Service”(验证服务)。 119端口:119端口是为“Network News Transfer Protocol”(网络新闻组传输协议,简称NNTP)开放的。 135端口:135端口主要用于使用RPC(Remote Procedure Call,远程过程调用)协议并提供DCOM(分布式组件对象模型)服务。 137端口:137端口主要用于“NetBIOS Name Service”(NetBIOS名称服务)。 139端口:139端口是为“NetBIOS Session Service”提供的,主要用于提供Windows文件和打印机共享以及Unix中的Samba服务。 143端口:143端口主要是用于“Internet Message Access Protocol”v2(Internet消息访问协议,简称IMAP)。 161端口:161端口是用于“Simple Network Management Protocol”(简单网络管理协议,简称SNMP)。 443端口:43端口即网页浏览端口,主要是用于HTTPS服务,是提供加密和通过安全端口传输的另一种HTTP。 554端口:554端口默认情况下用于“Real Time Streaming Protocol”(实时流协议,简称RTSP)。 1024端口:1024端口一般不固定分配给某个服务,在英文中的解释是“Reserved”(保留)。 1080端口:1080端口是Socks代理服务使用的端口,大家平时上网使用的WWW服务使用的是HTTP协议的代理服务。 1755端口:1755端口默认情况下用于“Microsoft Media Server”(微软媒体服务器,简称MMS 4000端口:4000端口是用于大家经常使用的QQ聊天工具的,再细说就是为QQ客户端开放的端口,QQ服务端使用的端口是8000。 5554端口:在今年4月30日就报道出现了一种针对微软lsass服务的新蠕虫病毒——震荡波(Worm.Sasser),该病毒可以利用TCP 5554端口开启一个FTP服务,主要被用于病毒的传播。 5632端口:5632端口是被大家所熟悉的远程控制软件pcAnywhere所开启的端口。 8080端口:8080端口同80端口,是被用于WWW代理服务的,可以实现网页端口概念 在网络技术中,端口(Port)大致有两种意思: 一是物理意义上的端口,比如,ADSL Modem、集线器、交换机、路由器用于连接其他网络设备的接口,如RJ-45端口、SC端口等等。 二是逻辑意义上的端口,一般是指TCP/IP协议中的端口端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。我们这里将要介绍的就是逻辑意义上的端口端口分类 逻辑意义上的端口有多种分类标准,下面将介绍两种常见的分类: 1. 按端口号分布划分 (1)知名端口(Well-Known Ports) 知名端口即众所周知的端口号,范围从0到1023,这些端口号一般固定分配给一些服务。比如21端口分配给FTP服务,25端口分配给SMTP(简单邮件传输协议)服务,80端口分配给HTTP服务,135端口分配给RPC(远程过程调用)服务等等。 (2)动态端口(Dynamic Ports) 动态端口的范围从1024到65535,这些端口号一般不固定分配给某个服务,也就是说许多服务都可以使用这些端口。只要运行的程序向系统提出访问网络的申请,那么系统就可以从这些端口号中分配一个供该程序使用。比如1024端口就是分配给第一个向系统发出申请的程序。在关闭程序进程后,就会释放所占用的端口号。 不过,动态端口也常常被病毒木马程序所利用,如冰河默认连接端口是7626、WAY 2.4是8011、Netspy 3.0是7306、YAI病毒是1024等等。 2. 按协议类型划分 按协议类型划分,可以分为TCP、UDP、IP和ICMP(Internet控制消息协议)等端口。下面主要介绍TCP和UDP端口: (1)TCP端口 TCP端口,即传输控制协议端口,需要在客户端和服务器之间建立连接,这样可以提供可靠的数据传输。常见的包括FTP服务的21端口,Telnet服务的23端口,SMTP服务的25端口,以及HTTP服务的80端口等等。 (2)UDP端口 UDP端口,即用户数据包协议端口,无需在客户端和服务器之间建立连接,安全性得不到保障。常见的有DNS服务的53端口,SNMP(简单网络管理协议)服务的161端口,QQ使用的8000和4000端口等等。 查看端口 在Windows 2000/XP/Server 2003中要查看端口,可以使用Netstat命令: 依次点击“开始→运行”,键入“cmd”并回车,打开命令提示符窗口。在命令提示符状态下键入“netstat -a -n”,按下回车键后就可以看到以数字形式显示的TCP和UDP连接的端口号及状态(如图)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值