import java.net.*;
import java.io.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class TCPThread extends Thread
{
public static InetAddress hostAddress;
public static int MIN_port;
public static int MAX_port;
private int threadnum;
public TCPThread(String name,int threadnum)
{
super(name);
this.threadnum = threadnum;
}
public void run()
{
int i;
Socket theTCPsocket;
for (i = MIN_port+threadnum; i < MAX_port; i += Integer.parseInt(ThreadScan.maxThread.getText()))
{
ThreadScan.status.setText("扫描状态:正在扫描 "+i+" 端口");
try
{
theTCPsocket=new Socket(hostAddress,i);
theTCPsocket.close();
ThreadScan.Result.append(" "+i);
switch(i)
{
case 21:
ThreadScan.Result.append("(FTP)");
break;
case 23:
ThreadScan.Result.append("(TELNET)");
break;
case 25:
ThreadScan.Result.append("(SMTP)");
break;
case 80:
ThreadScan.Result.append("(HTTP)");
break;
case 110:
ThreadScan.Result.append("(POP)");
break;
case 139:
ThreadScan.Result.append("(netBIOS)");
break;
}
ThreadScan.Result.append(",");
}
catch (IOException e)
{}
}
if (i==MAX_port)
{
ThreadScan.Result.append("\n"+"扫描完成...");
ThreadScan.status.setText("扫描状态:完成!");
}
}
}
class CancleAction implements ActionListener
{
public void actionPerformed (ActionEvent e)
{
System.exit(1);
}
}
class SubmitAction implements ActionListener
{
public void actionPerformed (ActionEvent a)
{
int minPort;
int maxPort;
int maxThread;
try
{
minPort=Integer.parseInt(ThreadScan.minPort.getText());
maxPort=Integer.parseInt(ThreadScan.maxPort.getText());
maxThread=Integer.parseInt(ThreadScan.maxThread.getText());
}
catch(NumberFormatException e)
{
ThreadScan.DLGINFO.setText("错误的端口号或线程数!端口号和线程数必须为整数!");
ThreadScan.DLGError.setVisible(true);
ThreadScan.status.setText("扫描状态:未开始");
return;
}
try
{
TCPThread.hostAddress=InetAddress.getByName(ThreadScan.hostname.getText());
}
catch(UnknownHostException e)
{
ThreadScan.DLGINFO.setText(" 错误的IP地址/域名或地址不可达! ");
ThreadScan.DLGError.setVisible(true);
ThreadScan.status.setText("扫描状态:未开始");
return;
}
if(minPort<0 || minPort>65535 || minPort>maxPort)
{
ThreadScan.DLGINFO.setText("最小端口必须是0-65535并且小于最大端口的整数!");
ThreadScan.DLGError.setVisible(true);
return;
}
else TCPThread.MIN_port=minPort;
if(maxPort<0 || maxPort>65535 || maxPort<minPort)
{
ThreadScan.DLGINFO.setText("最大端口必须是0-65535并且大于最小端口的整数!");
ThreadScan.DLGError.setVisible(true);
ThreadScan.status.setText("扫描状态:未开始");
return;
}
else TCPThread.MAX_port=maxPort;
if(maxThread<1 || maxThread>200)
{
ThreadScan.DLGINFO.setText(" 线程数为1-200的整数! ");
ThreadScan.DLGError.setVisible(true);
ThreadScan.status.setText("扫描状态:未开始");
return;
}
ThreadScan.Result.setText("");
ThreadScan.Result.append("正在扫描 "+ThreadScan.hostname.getText()+" 线程数 "+ThreadScan.maxThread.getText()+"\n");
ThreadScan.Result.append("开放端口: ");
for(int i=0;i<maxThread;i++)
{
new TCPThread("T" + i,i).start();
}
}
}
class OKAction implements ActionListener
{
public void actionPerformed (ActionEvent e)
{
ThreadScan.DLGError.dispose();
}
}
public class ThreadScan
{
public static JFrame main=new JFrame("基于JAVA的多线程TCP端口扫描程序");
public static JTextArea Result=new JTextArea("",4,43);
public static JTextField hostname=new JTextField("localhost",8);
public static JTextField minPort=new JTextField("0",4);
public static JTextField maxPort=new JTextField("1000",4);
public static JTextField maxThread=new JTextField("100",3);
public static JDialog DLGError=new JDialog(main,"错误!");
public static Label DLGINFO=new Label("");
public static Label status=new Label("扫描状态:未开始");
public static void main(String[] args)
{
main.setSize(500,220);
main.setLocation(300,300);
main.setResizable(false);
DLGError.setSize(300,100);
DLGError.setLocation(400,400);
JPanel mainPanel = new JPanel();
Label H=new Label("ip或域名:");
Label P1=new Label("端口范围:");
Label P2=new Label("~");
Label TNUM=new Label("线程数:");
Label RST=new Label("扫描结果: ");
Label con=new Label(" ");
Result.setLineWrap(true);
Result.setEditable(false);
JButton OK = new JButton("确定");
JButton Submit = new JButton("确定");
JButton Cancel = new JButton("取消");
Container mPanel = main.getContentPane();
Container dPanel = DLGError.getContentPane();
mPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
dPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
mPanel.add(H);
mPanel.add(hostname);
mPanel.add(P1);
mPanel.add(minPort);
mPanel.add(P2);
mPanel.add(maxPort);
mPanel.add(TNUM);
mPanel.add(maxThread);
mPanel.add(RST);
mPanel.add(Result);
mPanel.add(con);
mPanel.add(Submit);
mPanel.add(Cancel);
mPanel.add(status);
dPanel.add(DLGINFO);
dPanel.add(OK);
main.setVisible(true);
Submit.addActionListener(new SubmitAction());
Cancel.addActionListener(new CancleAction());
OK.addActionListener(new OKAction());
}
}
- 大小: 27.5 KB
分享到:
相关推荐
例如,在编写网络安全工具如端口扫描器nmap时,原始套接字允许用户构造自定义的网络包,以探测网络中的设备和服务。除了安全应用,原始套接字也可以用于开发新的传输层协议或对现有协议进行测试。 此外,原始套接字...
2. **创建套接字**:使用`socket`函数创建一个TCP套接字。参数包括地址族(AF_INET代表IPv4),套接字类型(SOCK_STREAM代表TCP)和协议(IPPROTO_TCP)。 3. **设置目标主机和端口**:使用`inet_addr`或`...
总结起来,使用VC++实现端口扫描状态涉及网络套接字编程、端口状态判断、错误处理等多个知识点。通过深入理解这些概念和技术,开发者可以构建出功能强大、性能优异的端口扫描工具,为网络安全评估和系统维护提供有力...
综上所述,VC++实现端口扫描涉及到网络编程的基本概念、Winsock库的使用、套接字的创建和操作、错误处理以及性能优化等多个方面。在实际开发中,可以根据需求调整代码,实现更复杂的功能,如自定义扫描策略、结果...
### 多线程端口扫描/C语言、套接字开发 #### 一、概述 本文主要介绍了使用C语言实现一个多线程的端口扫描工具,该工具基于Windows平台下的Winsock2库进行网络通信,利用多线程技术来提高扫描效率。在网络安全领域...
在这里,我们使用 socket.socket(family, type) 创建了一个 socket 对象,其中 family 代表地址家族,可以是 AF_INET(Internet 通信)或 AF_UNIX(同一台机器上进程间通信),type 代表套接字类型,可以是 SOCK_...
1. **套接字编程**:端口扫描程序的基础是套接字编程,它是网络通信的核心。在Windows环境下,我们可以使用Winsock库来创建和操作套接字。首先需要`#include <winsock2.h>`和`#pragma comment(lib, "ws2_32.lib")`...
端口扫描是网络安全领域中的...通过学习这段C++端口扫描源码,开发者不仅可以掌握端口扫描的基本原理,还能深入了解套接字编程和网络通信机制,这对于进行网络安全分析、漏洞检测或开发相关工具都具有很高的实践价值。
C++是实现端口扫描的一种常见编程语言,它提供了丰富的网络编程接口,如套接字(socket)API。以下是一些关键的C++端口扫描知识点: 1. **套接字编程**:C++通过调用操作系统提供的套接字API来实现网络通信。`#...
综上所述,编写一个C语言的端口扫描器涉及网络编程的基本原理,包括套接字创建、连接操作、错误处理等,同时也需要对网络安全和网络协议有一定的理解。通过实践这样的项目,开发者可以提升对网络编程的深入认识。
1. **套接字编程**:使用socket()函数创建套接字,这是所有网络编程的基础。套接字是进程间通信的一种接口,用于连接网络上的两个节点。 2. **地址解析**:使用gethostbyname()或getaddrinfo()函数将主机名转换为IP...
在这里,我们通常使用TCP套接字,因为端口扫描更常用于检查基于TCP的服务。 2. **网络地址转换(Inet Address Conversion)**:使用`inet_aton()`或`inet_addr()`函数将IP地址字符串转换为二进制表示,便于与套接字...
在VC++环境下,我们可以利用套接字(Socket)编程来实现端口扫描程序。本文将详细介绍如何在Windows环境下使用VC++进行端口扫描,并探讨相关知识点。 一、基础概念 1. **套接字(Socket)**:套接字是网络通信中的...
2. **创建套接字**:使用`socket()`函数创建一个套接字,指定协议族(AF_INET表示IPv4),套接字类型(SOCK_STREAM表示TCP,SOCK_DGRAM表示UDP),以及协议(通常为0)。 3. **设置目标主机和端口**:将目标主机的...
`select`允许我们在一组套接字上等待多个事件(如读、写或连接完成)。当某个连接尝试接近完成时,`select`会返回,这样我们就可以立即检查`connect`的结果,而不是让每个连接尝试都等待其自然超时。这样可以显著...
2.2端口的有效范围是1~65535,在该范围内使用多线程机制循环创建客户端套接字对象,对某一地址(段)的主机端口进行扫描,若套接字没有发生异常,说明该端口打开并提供服务,返回该开放端口的类型(如UDP端口还是TCP...
在易语言中,这可能涉及到创建网络套接字(socket)并使用系统执行函数发送和接收数据。"扫描端口"是实际执行扫描的函数,可能包含一个循环,遍历指定的端口范围,尝试建立连接。 3. **得到端口号**:在扫描过程中...
在实现端口扫描程序时,C++可以通过使用套接字API来与网络进行交互。套接字是操作系统提供的一种接口,用于网络通信。在Windows系统中,这通常是通过Winsock库(Windows Sockets)实现的,它是Win32 SDK的一部分。 ...
type参数: 套接字类型,这里使用了SOCK_STREAM,流套接字 protocol参数:配合type使用,指定协议类型,这里使用IPPROTO_TCP(就是TCP协议) */ server.sin_port=htons(CurrPort); //指定被扫描IP地址的端口号 ret...
2. 创建套接字:使用`socket()`函数创建一个流式套接字(SOCK_STREAM),对应TCP协议。 3. 设置目标主机和端口:获取用户输入的目标IP地址和端口范围。 4. 循环扫描:遍历指定的端口号,对每个端口执行以下操作: -...