文档库 最新最全的文档下载
当前位置:文档库 › (完整word版)端口扫描程序设计(详细的报告+源代码)

(完整word版)端口扫描程序设计(详细的报告+源代码)

(完整word版)端口扫描程序设计(详细的报告+源代码)
(完整word版)端口扫描程序设计(详细的报告+源代码)

网络综合实验

任务书

一、目的与要求

1.性质:设计性实验。

2.任务:设计并实现一个端口扫描程序,检测某个IP或某段IP的计算机的端口工作情况。

3.目的:加深对课堂讲授知识的理解,熟练掌握基本的网络编程技术和方法,建立网络编程整体概念,使得学生初步具有研究、设计、编制和调试网络程序的能力。

4.要求:熟悉有关定义、概念和实现算法,设计出程序流程框图和数据结构,编写出完整的源程序,基本功能完善,方便易用,操作无误。

5.学生要求人数:1人。

二、主要内容

1.编写一个端口扫描程序,能够显示某个IP或某段IP的计算机的某一个或某些端口是否正在工作。基本工作过程如下:

(1) 设定好一定的端口扫描范围;

(2) 设定每个端口扫描的次数,因为有可能有的端口一次扫描可能不通;

(3) 创建socket,通过socket的connect方法来连接远程IP地址以及对应的端口;

(4) 如果返回false,表示端口没有开放,否则端口开放。

三、进度计划

四、设计成果要求

1.完成规定的实验任务,保质保量;

2.完成综合实验报告,要求格式规范,内容具体而翔实,应体现自身所做的工作,注重对实验思路的归纳和对问题解决过程的总结。

五、考核方式

1.平时成绩+验收答辩+实验报告;

2.五级分制。

学生姓名:

指导教师:

2009 年6月8 日

一、综合实验的目的与要求

1.目的:加深对课堂讲授知识的理解,熟练掌握基本的网络编程技术和方法,建立网络编程整体概念,加深对JAVA编程语言的使用,促进编程能力的提高,同时为网络编程打下一个比较好的基础。同时对实验的过程要有完全的了解。

2.要求:熟悉有关定义、概念和实现算法,设计出程序流程框图和数据结构,编写出

完整的源程序,基本功能完善,方便易用,操作无误。

二、综合实验正文

1.编程语言的选择

针对编写的是端口扫描的程序,所以我选择了JA V A编程,因为要简单而方便的试验端口扫描的功能。

2.端口扫描实现的功能是:显示某个IP或某段IP的计算机的某一个或某些端口是否正在工作

2.1 如何选择IP段和端口

创建socket,通过socket的connect方法来连接远程IP地址以及对应的端口。而我使用的是socket函数来实现端口的扫描和IP地址的选择扫描。

2.2 如何实现快速扫描端口

通过实现多线程,当一个IP或者一个端口同时分配多个线程进行扫描,速度会比单线程扫描快许多。

2.3 显示扫描结果

可以在使用JA V A编写的时候,可以通过使用JScrollPane控件实现显示结果。

2.4 实现要求功能之余美化外观

3.创建应用程序界面

3.1 建立主窗体,“JA V A端口扫描器”

图1-1

3.2 IP地址的输入部分

图1-2

3.3 端口部分,其中包括指定的端口和指定扫描的端口范围

图1-3

3.4 多线程的实现和延时的控制部分

图1-4

3.5 增加的保存及快捷键功能

图1-5

4.扫描的整个过程

4.1 填写IP地址192.168.1.100—192.168.1.120

4.2 填写端口扫描的范围为1—300

4.3 线程数选择为100

4.4 扫描结果如下

图1-6

三.端口扫描的主要部分程序如下

import https://www.wendangku.net/doc/7011662101.html,.*;

import java.io.*;

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

/*

*实现扫描的主体程序

*/

public class ThreadScan{

public static JFrame main=new JFrame("JA V A端口扫描器");

//显示扫描结果

public static JTextArea Result=new JTextArea("",4,40);

//滚动条面板

public static JScroll PaneresultPane = newJScrollPane(Result,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,

JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED;

//输入主机名文本框

public static JTextField hostname=new JTextField("localhost",8);

//输入ip地址前3位的输入框

public static JTextField fromip1=new JTextField("0",3);

//输入ip地址4~6位的输入框

public static JTextField fromip2=new JTextField("0",3);

//输入ip地址7~9位的输入框

public static JTextField fromip3=new JTextField("0",3);

//输入起始ip地址最后4位的输入框

public static JTextField fromip4=new JTextField("0",3);

//输入目标ip地址最后4位的输入框

public static JTextField toip=new JTextField("0",3);

//输入最小端口的输入框

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 JLabel DLGINFO=new JLabel("");

public static JLabel type=new JLabel("请选择:");

//扫描类型

public static JRadioButton radioIp = new JRadioButton("IP地址:");

public static JRadioButton radioHost = new JRadioButton("主机名:",true);

//单选框组

public static ButtonGroup group = new ButtonGroup();

public static JLabel P1=new JLabel("端口范围:");

public static JLabel P2=new JLabel("~");

public static JLabel P3=new JLabel("~");

public static JLabel Pdot1 = new JLabel(".");

public static JLabel Pdot2 = new JLabel(".");

public static JLabel Pdot3 = new JLabel(".");

public static JLabel TNUM=new JLabel("线程数:");

public static JLabel RST=new JLabel("扫描结果: ");

public static JLabel con=new JLabel(" ");

//定义按钮

public static JButton OK = new JButton("确定");

public static JButton Submit = new JButton("开始扫描");

public static JButton Cancel = new JButton("退出");

public static JButton saveButton = new JButton("保存扫描结果");

//菜单栏

public static JMenuBar myBar = new JMenuBar();

public static JMenu myMenu = new JMenu("文件(F)");

public static JMenuItem saveItem = new JMenuItem("保存扫描结果(S)");

public static JMenuItem exitItem = new JMenuItem("退出(Q)");

public static void main(String[] args){

main.setSize(500,400);

main.setLocation(300,300);

main.setResizable(false);

main.setLayout(new GridBagLayout());

main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

DLGError.setSize(300,100);

DLGError.setLocation(400,400);

//添加“菜单栏”

myMenu.add(saveItem);

myMenu.add(exitItem);

myBar.add(myMenu);

main.setJMenuBar(myBar);

//设置热键

myMenu.setMnemonic('F');

saveItem.setMnemonic ('S');

//为“另存为”组件设置快捷键为ctrl+s

saveItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,InputEvent.CTRL_ MASK));

exitItem.setMnemonic('Q');

exitItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E,InputEvent.CTRL_ MASK));

//采用表格包型布局

Container mPanel = main.getContentPane(); GridBagConstraints c = new GridBagConstraints();

c.insets = new Insets(10,0,0,10);

c.gridx = 0;

c.gridy = 0;

c.gridwidth = 10;

c.fill = GridBagConstraints.BOTH;

c.anchor = GridBagConstraints.CENTER; mPanel.add(type,c);

group.add(radioIp);

group.add(radioHost);

c.gridx = 0;

c.gridy = 1;

c.gridwidth = 1;

c.fill = GridBagConstraints.BOTH;

c.anchor = GridBagConstraints.CENTER; mPanel.add(radioIp,c);

c.gridx = 1;

c.gridy = 1;

c.gridwidth = 1;

c.fill = GridBagConstraints.BOTH;

c.anchor = GridBagConstraints.CENTER; mPanel.add(fromip1,c);

c.gridx = 2;

c.gridy = 1;

c.gridwidth = 1;

c.fill = GridBagConstraints.BOTH;

c.anchor = GridBagConstraints.CENTER; mPanel.add(Pdot1,c);

c.gridx = 3;

c.gridy = 1;

c.gridwidth = 1;

c.fill = GridBagConstraints.BOTH;

c.anchor = GridBagConstraints.CENTER; mPanel.add(fromip2,c);

c.gridx = 4;

c.gridy = 1;

c.gridwidth = 1;

c.fill = GridBagConstraints.BOTH;

c.anchor = GridBagConstraints.CENTER; mPanel.add(Pdot2,c);

c.gridx = 5;

c.gridy = 1;

c.gridwidth = 1;

c.fill = GridBagConstraints.BOTH;

c.anchor = GridBagConstraints.CENTER; mPanel.add(fromip3,c);

c.gridy = 1;

c.gridwidth = 1;

c.fill = GridBagConstraints.BOTH;

c.anchor = GridBagConstraints.CENTER; mPanel.add(Pdot3,c);

c.gridx = 7;

c.gridy = 1;

c.gridwidth = 1;

c.fill = GridBagConstraints.BOTH;

c.anchor = GridBagConstraints.CENTER; mPanel.add(fromip4,c);

c.gridx = 8;

c.gridy = 1;

c.gridwidth = 1;

c.fill = GridBagConstraints.BOTH;

c.anchor = GridBagConstraints.CENTER; mPanel.add(P2,c);

c.gridx = 9;

c.gridy = 1;

c.gridwidth = 1;

c.fill = GridBagConstraints.BOTH;

c.anchor = GridBagConstraints.CENTER; mPanel.add(toip,c);

c.gridx = 0;

c.gridy = 2;

c.gridwidth = 1;

c.fill = GridBagConstraints.BOTH;

c.anchor = GridBagConstraints.CENTER; mPanel.add(radioHost,c);

c.gridx = 1;

c.gridy = 2;

c.gridwidth = 3;

c.fill = GridBagConstraints.BOTH;

c.anchor = GridBagConstraints.CENTER; mPanel.add(hostname,c);

c.gridx = 0;

c.gridy = 3;

c.gridwidth = 1;

c.fill = GridBagConstraints.BOTH;

c.anchor = GridBagConstraints.CENTER; mPanel.add(P1,c);

c.gridx = 1;

c.gridy = 3;

c.gridwidth = 1;

c.fill = GridBagConstraints.BOTH;

c.anchor = GridBagConstraints.CENTER; mPanel.add(minPort,c);

c.gridx = 2;

c.gridwidth = 1;

c.fill = GridBagConstraints.BOTH;

c.anchor = GridBagConstraints.CENTER; mPanel.add(P3,c);

c.gridx = 3;

c.gridy = 3;

c.gridwidth = 1;

c.fill = GridBagConstraints.BOTH;

c.anchor = GridBagConstraints.CENTER; mPanel.add(maxPort,c);

c.gridx = 0;

c.gridy = 4;

c.gridwidth = 1;

c.fill = GridBagConstraints.BOTH;

c.anchor = GridBagConstraints.CENTER; mPanel.add(TNUM,c);

c.gridx = 1;

c.gridy = 4;

c.gridwidth = 3;

c.fill = GridBagConstraints.BOTH;

c.anchor = GridBagConstraints.CENTER; mPanel.add(maxThread,c);

c.gridx = 0;

c.gridy = 5;

c.gridwidth = 3;

c.fill = GridBagConstraints.VERTICAL;

c.anchor = GridBagConstraints.CENTER; mPanel.add(Submit,c);

c.gridx = 6;

c.gridy = 5;

c.gridwidth = 4;

c.fill = GridBagConstraints.VERTICAL;

c.anchor = GridBagConstraints.CENTER; mPanel.add(Cancel,c);

c.gridx = 0;

c.gridy = 6;

c.gridwidth = 10;

c.fill = GridBagConstraints.BOTH;

c.anchor = GridBagConstraints.CENTER; mPanel.add(RST,c);

//设置文本区域可以换行

Result.setLineWrap(true);

//设置文本区域不可编辑

Result.setEditable(false);

c.gridx = 0;

c.gridy = 7;

c.gridwidth = 10;

c.gridheight = 4;

c.fill = GridBagConstraints.VERTICAL;

c.anchor = GridBagConstraints.CENTER;

mPanel.add(resultPane,c);

Container dPanel = DLGError.getContentPane();

dPanel.setLayout(new FlowLayout(FlowLayout.CENTER));

dPanel.add(DLGINFO);

dPanel.add(OK);

Submit.addActionListener(new SubmitAction());

Cancel.addActionListener(new CancleAction());

OK.addActionListener(new OKAction());

//实现退出功能

exitItem.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) {

System.exit(0);

}

});

//实现帮助功能

saveButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) {

JFileChooser fc=new JFileChooser();

int returnVal=fc.showSaveDialog(null);

//点击“保存”

if(returnVal == 0){

File saveFile=fc.getSelectedFile();

try {

FileWriter writeOut = new FileWriter(saveFile);

writeOut.write(ThreadScan.Result.getText());

writeOut.close();

}

catch (IOException ex) {

System.out.println("保存失败");

}

}

//点击“取消”

else

return;

}

});

main.setVisible(true);

}

}

/*

*实现“取消”功能

*/

class CancleAction implements ActionListener{

public void actionPerformed (ActionEvent e){

System.exit(0);

}

}

/*

*实现“确定”功能

*完成扫描

*/

class SubmitAction implements ActionListener{

public void actionPerformed (ActionEvent a){

int minPort;

int maxPort;

int maxThread;

int ip1 = 0;

int ip2 = 0;

int ip3 = 0;

int ipstart = 0;

int ipend = 0;

String ipaddress = "";

String hostname = "";

ThreadScan.Result.setText("");

//将"确定"按钮设置成为不可用

if(ThreadScan.Submit.isEnabled()){

ThreadScan.Submit.setEnabled(false);

}

/*

*判断搜索的类型

*按照ip地址扫描:type = 0

*按照主机名称扫描:type = 1

*/

if(ThreadScan.radioIp.isSelected()){

TCPThread.type = 0;

//判断ip的前3位是否为int型

try{

ip1=Integer.parseInt(ThreadScan.fromip1.getText());

}

catch(NumberFormatException e){

ThreadScan.DLGINFO.setText("错误的ip!");

ThreadScan.DLGError.setVisible(true);

return;

}

//判断ip的4~6位是否为int型

ip2=Integer.parseInt(ThreadScan.fromip2.getText());

}

catch(NumberFormatException e){

ThreadScan.DLGINFO.setText("错误的ip!");

ThreadScan.DLGError.setVisible(true);

return;

}

//判断ip的7~9位是否为int型

try{

ip3=Integer.parseInt(ThreadScan.fromip3.getText());

}

catch(NumberFormatException e){

ThreadScan.DLGINFO.setText("错误的ip!");

ThreadScan.DLGError.setVisible(true);

return;

}

//判断起始ip的最后4位是否为int型

try{

ipstart=Integer.parseInt(ThreadScan.fromip4.getText());

}

catch(NumberFormatException e){

ThreadScan.DLGINFO.setText("错误的ip!");

ThreadScan.DLGError.setVisible(true);

return;

}

//判断目标ip的最后4位是否为int型

try{

ipend=Integer.parseInt(ThreadScan.toip.getText());

}

catch(NumberFormatException e){

ThreadScan.DLGINFO.setText("错误的目标ip!");

ThreadScan.DLGError.setVisible(true);

return;

}

//判断起始ip是否正确

//判断条件:大于0且小于等于255

if(ip1<0 || ip1>255||ip2<0 || ip2>255||ip3<0 || ip3>255||ipstart<0 || ipstart>255){ ThreadScan.DLGINFO.setText(" ip地址为0-255的整数! ");

ThreadScan.DLGError.setVisible(true);

return;

}

else{

TCPThread.ip1 = ip1;

TCPThread.ip2 = ip2;

TCPThread.ip3 = ip3;

TCPThread.ipstart = ipstart;

}

//判断目标ip是否正确

//判断条件:大于0且小于等于255

if(ipend<0 || ipend>255){

ThreadScan.DLGINFO.setText("目标ip地址为0-255的整数! ");

ThreadScan.DLGError.setVisible(true);

return;

}

else{

TCPThread.ipend = ipend;

}

ipaddress = "" + ip1 + ip2 + ip3 + ipstart;

/*

*判断ip地址的有效性

*/

try{

TCPThread.hostAddress=InetAddress.getByName(ipaddress);

}

catch(UnknownHostException e){

ThreadScan.DLGINFO.setText(" 错误的IP或地址不可达! ");

ThreadScan.DLGError.setVisible(true);

return;

}

}

//根据主机名进行端口扫描

if(ThreadScan.radioHost.isSelected()){

TCPThread.type = 1;

/*

*判断主机名称的有效性

*/

try{

TCPThread.hostAddress=InetAddress.getByName(ThreadScan.hostname.getText());

}

catch(UnknownHostException e){

ThreadScan.DLGINFO.setText("错误的域名或地址不可达! ");

ThreadScan.DLGError.setVisible(true);

return;

}

}

/*

*判断端口号的有效性

*/

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);

return;

}

/*

*判断最小端口号的有效范围

*判断条件:大于0且小于65535,最大端口应大于最小端口

*/

if(minPort<0 || minPort>65535 || minPort>maxPort){

ThreadScan.DLGINFO.setText("最小端口必须是0-65535并且小于最大端口的整数!");

ThreadScan.DLGError.setVisible(true);

return;

}

else{

TCPThread.MIN_port=minPort;

}

/*

*判断最大端口号的有效范围

*判断条件:大于0且小于65535,最大端口应大于最小端口

*/

if(maxPort<0 || maxPort>65535 || maxPort

ThreadScan.DLGINFO.setText("最大端口必须是0-65535并且大于最小端口的整数!");

ThreadScan.DLGError.setVisible(true);

return;

}

else{

TCPThread.MAX_port=maxPort;

}

/*

*判断线程数量的有效范围

*判断条件:大于1且小于200

*/

if(maxThread<1 || maxThread>200){

ThreadScan.DLGINFO.setText("线程数为1-200的整数! ");

ThreadScan.DLGError.setVisible(true);

return;

}

ThreadScan.Result.append("线程数"+ThreadScan.maxThread.getText()+"\n");

//启动线程

for(int i=0;i

new TCPThread("T" + i,i).start();

}

}

}

/*

*实现错误提示框中的“确定”按钮功能

*/

class OKAction implements ActionListener{

public void actionPerformed (ActionEvent e){

ThreadScan.DLGError.dispose();

}

}

多线程类文件:

import https://www.wendangku.net/doc/7011662101.html,.*;

import java.io.*;

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class TCPThread extends Thread{

public static InetAddress hostAddress;

//最小的端口号

public static int MIN_port;

//最大的端口号

public static int MAX_port;

//线程总数

private int threadnum;

//查询方式:0为ip;1为主机名

public static int type;

//ip地址前3位

public static int ip1;

//ip地址4~6位

public static int ip2;

//ip地址7~9位

public static int ip3;

//起始ip地址的最后4位

public static int ipstart;

//结束ip地址的最后4位

public static int ipend;

//完整的ip地址

public static String ipAll;

//扫描的主机名称或ip

String hostname = "";

//端口的类别

String porttype = "0";

/*

*构造函数

*/

public TCPThread(String name,int threadnum){ super(name);

this.threadnum = threadnum;

}

/*

*运行函数

*/

public void run() {

//ip地址

int h = 0;

//端口号

int i = 0;

Socket theTCPsocket;

//根据ip地址进行扫描

if(type == 0){

//ip地址循环扫描

for(h = ipstart; h <=ipend; h++){

//组成完整的ip地址

ipAll = "" + ip1 + "." + ip2 + "." + ip3 + "." + h;

hostname = ipAll;

try{

//在给定主机名的情况下确定主机的IP 地址

hostAddress=InetAddress.getByName(ipAll);

}

catch(UnknownHostException e){

}

//不同的端口循环扫描

for (i = MIN_port+threadnum; i < MAX_port + Integer.parseInt(ThreadScan.maxThread.getText()); i += Integer.parseInt(ThreadScan.maxThread.getText())){

try{

theTCPsocket=new Socket(hostAddress,i);

theTCPsocket.close();

ThreadScan.Result.append(hostname+":"+i);

//判断端口的类别

switch(i){

case 21:

porttype = "(FTP)";

break;

case 23:

porttype = "(TELNET)";

break;

case 25:

porttype = "(SMTP)";

break;

case 80:

porttype = "(HTTP)";

break;

case 110:

porttype = "(POP)";

break;

case 139:

porttype = "(netBIOS)";

break;

case 1433:

porttype = "(SQL Server)";

break;

case 3389:

porttype = "(Terminal Service)";

break;

case 443:

porttype = "(HTTPS)";

break;

case 1521:

porttype = "(Oracle)";

break;

}

//端口没有特定类别

if(porttype.equals("0")){

ThreadScan.Result.append("\n");

}

else{

ThreadScan.Result.append(":"+porttype+"\n");

}

}

catch (IOException e){

}

}

}

//扫描完成后,显示扫描完成,并将“确定”按钮设置为可用

if (i==MAX_port+Integer.parseInt(ThreadScan.maxThread.getText())){

ThreadScan.Result.append("\n"+"扫描完成...");

//将"确定"按钮设置成为可用

if(!ThreadScan.Submit.isEnabled()){

ThreadScan.Submit.setEnabled(true);

}

}

}

//按照主机名进行端口扫描

if(type == 1){

for (i = MIN_port+threadnum; i < MAX_port+Integer.parseInt(ThreadScan.maxThread.getText()); i += Integer.parseInt(ThreadScan.maxThread.getText())){

try{

theTCPsocket=new Socket(hostAddress,i);

theTCPsocket.close();

ThreadScan.Result.append(" "+i);

switch(i){

case 21:

porttype = "(FTP)";

break;

case 23:

porttype = "(TELNET)";

break;

case 25:

porttype = "(SMTP)";

break;

case 80:

porttype = "(HTTP)";

break;

case 110:

porttype = "(POP)";

break;

case 139:

porttype = "(netBIOS)";

break;

case 1433:

porttype = "(SQL Server)";

break;

case 3389:

porttype = "(Terminal Service)";

break;

case 443:

porttype = "(HTTPS)";

break;

case 1521:

porttype = "(Oracle)";

break;

}

//端口没有特定类别

if(porttype.equals("0")){

ThreadScan.Result.append("\n");

}

else{

ThreadScan.Result.append(":"+porttype+"\n");

}

}

catch (IOException e){

}

}

//扫描完成后,显示扫描完成,并将【确定】按钮设置为可用

if (i==MAX_port+Integer.parseInt(ThreadScan.maxThread.getText())){ ThreadScan.Result.append("\n"+"扫描完成...");

//将【确定】按钮设置成为可用

if(!ThreadScan.Submit.isEnabled()){

ThreadScan.Submit.setEnabled(true);

}

}

}

}

}

四、综合实验总结或结论

1.通过本次实验,我对于JA V A编程又有了一个新的认识2.了解了IP地址扫描和端口扫描的原理。

3.通过解决编程遇到的问题,提高编程水平,积累经验。

软件工程 实验报告

v1.0 可编辑可修改 院系:计算机科学学院 专业:计算机科学与技术 年级: 2013级 课程名称:软件工程 组员:司少武(1135) 兰少雄(1136) 张宇(1133) 纳洪泽(1132) 指导教师:刘卫平 2015年 12月 26 日

聊天室 1 前言 即时消息系统的研究现状 即时消息系统[1](Instant Messenger,IM)是一种在后 PC 时代兴起的,以Internet 网络为基础的,允许交互双方即时地传送文字、语音、视频等信息,能够跟踪网络用户在线状态的网络应用软件。即时消息系统产生有着深刻的社会原因:人们都有渴望社交,获得社会尊重、实现自我的需求,这正是即时消息软件风行的原动力,而物质文明的日益发达所带来副作用,又使得人们习惯与周围的人保持距离,以致人们更愿意对陌生人敞开心扉,在网络中可以跨越年龄、身份、行业、地域的限制,达到人与人、人与信息之间的零距离交流。从这点上讲,即时消息系统的出现改变了人们的沟通方式和交友文化,大大拓展了个人生活交流的空间。 本工程的主要内容 随着互联网逐步普及,人们的生活和工作也越来越离不开信息网络的支持,而聊天室是人们最常见,最直接的网上交流的方式。本聊天系统以聊天交流为主,为广大用户提供一个借助网络进行人际交往的平台,也是网络与现实最贴近的实用型网站。本文所介绍的网络聊天系统是基于开放的JAVA应用程序开发设计的,其主要特性是能动态、实时的完成信息的传递,且具有高效的交互性,更有效的处理客户请求,且具有脱离数据库技术方法,易于维护和更新的特点。 2 需求分析 本系统所要实现的主要功能是当用户聊天时,将当前用户名、聊天对象、聊天内容、聊天语气和是否私聊进行封装,然后与服务器建立Socket连接,再用对象输出流包装Socket的输出流将聊天信息对象发送给服务器端当用户发送聊天信息时,服务端将会收到客户端用Socket传输过来的聊天信息对象,然后将其强制转换为Chat对象,并将本次用户的聊天信息对象添加

端口扫描实验报告

综合实验报告 ( 2010 -- 2011 年度第二学期) 名称:网络综合实验 题目:端口扫描程序 院系:信息工程系 班级: 学号: 学生姓名: 指导教师:鲁斌李莉王晓霞张铭泉设计周数: 2 周 成绩: 日期:2011年7月1日

一、综合实验的目的与要求 1.任务:设计并实现一个端口扫描程序,检测某个IP或某段IP的计算机的端口工作情况。 2.目的:加深对课堂讲授知识的理解,熟练掌握基本的网络编程技术和方法,建立网络编程整体概念,使得学生初步具有研究、设计、编制和调试网络程序的能力。 3.要求:熟悉有关定义、概念和实现算法,设计出程序流程框图和数据结构,编写出完整的源程序,基本功能完善,方便易用,操作无误。 4.学生要求人数:1人。 二、综合实验正文 1.端口扫描器功能简介:服务器上所开放的端口就是潜在的通信通道,也就是一个入侵通道。对目标计算机进行端口扫描,能得到许多有用的信息,进行端口扫描的方法很多,可以是手工进行扫描、也可以用端口扫描软件进行。扫描器通过选用远程TCP/IP不同的端口的服务,并记录目标给予的回答,通过这种方法可以搜集到很多关于目标主机的各种有用的信息,例如远程系统是否支持匿名登陆、是否存在可写的FTP目录、是否开放TELNET 服务和HTTPD服务等。 2.实验所用的端口扫描技术:端口扫描技术有TCP connect()扫描、TCP SYN扫描、TCP FIN 扫描、IP段扫描等等。本次实验所用的技术是TCP connect()扫描,这是最基本的TCP 扫描,操作系统提供的connect()系统调用可以用来与每一个感兴趣的目标计算机的端口进行连接。如果端口处于侦听状态,那么connect()就能成功。否则,这个端口是不能用的,即没有提供服务。这个技术的一个最大的优点是,你不需要任何权限。系统中的任何用户都有权利使用这个调用。 3.实验具体实现方案:编写一个端口扫描程序,能够显示某个IP或某段IP的计算机的某一个或某些端口是否正在工作。基本工作过程如下: (1) 设定好一定的端口扫描范围; (2) 设定每个端口扫描的次数,因为有可能有的端口一次扫描可能不通; (3) 创建socket,通过socket的connect方法来连接远程IP地址以及对应的端口; (4) 如果返回false,表示端口没有开放,否则端口开放。 4.有关TCP/IP的知识: 4.1套接字概念 1)在网络中要全局地标识一个参与通信的进程,需要采用三元组:协议、主机IP地址、端口号。

网络安全实验报告[整理版]

一Sniffer 软件的安装和使用 一、实验目的 1. 学会在windows环境下安装Sniffer; 2. 熟练掌握Sniffer的使用; 3. 要求能够熟练运用sniffer捕获报文,结合以太网的相关知识,分析一个自己捕获的以太网的帧结构。 二、实验仪器与器材 装有Windows操作系统的PC机,能互相访问,组成局域网。 三、实验原理 Sniffer程序是一种利用以太网的特性把网络适配卡(NIC,一般为以太同卡)置为杂乱模式状态的工具,一旦同卡设置为这种模式,它就能接收传输在网络上的每一个信息包。 四、实验过程与测试数据 1、软件安装 按照常规方法安装Sniffer pro 软件 在使用sniffer pro时需要将网卡的监听模式切换为混杂,按照提示操作即可。 2、使用sniffer查询流量信息: 第一步:默认情况下sniffer pro会自动选择网卡进行监听,手动方法是通过软件的file 菜单下的select settings来完成。 第二步:在settings窗口中我们选择准备监听的那块网卡,把右下角的“LOG ON”勾上,“确定”按钮即可。 第四步:在三个仪表盘下面是对网络流量,数据错误以及数据包大小情况的绘制图。 第五步:通过FTP来下载大量数据,通过sniffer pro来查看本地网络流量情况,FTP 下载速度接近4Mb/s。 第六步:网络传输速度提高后在sniffer pro中的显示也有了很大变化,utiliazation使用百分率一下到达了30%左右,由于我们100M网卡的理论最大传输速度为12.5Mb/s,所以4Mb/s刚好接近这个值的30%,实际结果和理论符合。 第七步:仪表上面的“set thresholds”按钮了,可以对所有参数的名称和最大显示上限进行设置。 第八步:仪表下的“Detail”按钮来查看具体详细信息。 第九步:在host table界面,我们可以看到本机和网络中其他地址的数据交换情况。

TCP的客户 服务器 端口扫描程序设计

海南大学信息科学技术学院《安全扫描技术》 TCP的客户/服务器/端口扫描程序设计 学号: ______ 姓名: 年级: 2010级 __________ 专业:信息安全 ______ 指导老师:顾剑 ____

目录 1实验目的及要求 (1) 2实验的背景及意义 (1) 3实验流程 (1) 4实验内容与步骤 (3) 5实验代码 (5) 5.1 TCP服务器程序: (5) 5.2 TCP客户端: (8) 5.3 TCP端口扫描: (10) 6实验操作手册 (11) 7实验总结 (14)

第 1 页共17 页 1实验目的及要求 (1)、熟悉Microsoft Visual Studio 2006编程环境。 (2)、了解TCP客户/服务器/扫描端口的模型原理。 (3)、熟悉Socket编程原理,掌握简单的套接字编程。 2实验的背景及意义 (1)、TCP客户和服务器 TCP是面向连接的,所谓面向连接,就是当计算机双方通信时必需先建立连接,然后数据传送,最后拆除连接三个过程并且TCP在建立连接时又分三步走: 第一步是请求端(客户端)发送一个包含SYN即同步(Synchronize)标志的TCP报文,SYN同步报文会指明客户端使用的端口以及TCP连接的初始序号; 第二步,服务器在收到客户端的SYN报文后,将返回一个SYN+ACK的报文,表示客户端的请求被接受,同时TCP 序号被加一,ACK即确认(Acknowledgement)。 第三步,客户端也返回一个确认报文ACK给服务器端,同样TCP序列号被加一,到此一个TCP连接完成。然后才开始通信的第二步:数据处理。 这就是所说的TCP三次握手(Three-way Handshake)。简单的说就是:(C:客户端,S:服务端) C:SYN到S S:如成功--返回给C(SYN+ACK) C:如成功---返回给S(ACK)以上是正常的建立连接方式(2)、TCP端口扫描 “端口”在计算机网络领域中是个非常重要的概念。它是专门为计算机通信而设计的,它不是硬件,不同于计算机中的“插槽”,可以说是个“软插槽”。如果有需要的话,一台计算机中可以有上万个端口。 端口是由TCP/IP协议定义的。其中规定,用IP地址和端口作为套接字,它代表TCP连接的一个连接端,一般称为Socket。具体来说,就是用[IP:端口]来定位一台主机中的进程。可以做这样的比喻,端口相当于两台计算机进程间的大门,可以随便定义,其目的只是为了让两台计算机能够找到对方的进程。计算机就像一座大楼,这个大楼有好多入口(端口),进到不同的入口中就可以找到不同的公司(进程)。如果要和远程主机A的程序通信,那么只要把数据发向[A:端口]就可以实现通信了。 可见,端口与进程是一一对应的,如果某个进程正在等待连接,称之为该进程正在监听,那么就会出现与它相对应的端口。由此可见,入侵者通过扫描端口,便可以判断出目标计算机有哪些通信进程正在等待连接,这也是端口扫描的主要目的。 3实验流程 (1)、TCP客户程序和服务器程序流程图 程序分两部分:客户程序和服务器程序。 工作过程是:服务器首先启动,它创建套接字之后等待客户的连接;客户启动后创建套接字,然后和服务器建立连接;建立连接后,客户接收键盘输入,然后将数据发送到服务器,服务器收到到数据后,将接收到的字符在屏幕上显示出来。或者服务器接收键盘输入,然后将数据发送到客户机,客户机收到数据后,将接收到的字符在屏幕上显示出来。

高级语言程序设计实验报告 C语言实验报告

C语言程序设计实验报告 实验二循环结构程序设计 班级 2012196 学号 201219628 姓名李明月 一、实验目的 (1)掌握用while语句,do-while语句和for语句实现循环的方法; (2)掌握循环结构的嵌套; (3)掌握break语句和continue语句的使用方法。 二、实验内容及步骤 1.相传国际象棋是古印度舍罕王的宰相达依尔发明的。舍罕王十分喜欢象棋,决定让宰相自己选择何种赏赐。这位聪明的宰相指着8×8共64格的象棋盘说:陛下,请您赏给我一些麦子吧,就在棋盘的第一个格子中放1粒,第2格中放2粒,第3格放4粒,以后每一格都比前一格增加一倍,依此放完棋盘上的64个格子,我就感恩不尽了。舍罕王让人扛来一袋麦子,他要兑现他的许诺。国王能兑现他的许诺吗? 程序1:试编程计算舍罕王共要多少粒麦子赏赐他的宰相,这些麦子合多少立方米?(已知1立方米麦子约1.42e8粒)总粒数为:sum=1+2+22+23+…+263 程序代码: #include int main( ) //定义一个主函数 { int i; double t=1,sum=1,v; //定义变量 for(i=1;i<=63;i++) //用for循环语句实现循环运算 { t=t*2; sum+=t; //循环表达式 } printf("总麦粒数为:%f\n",sum); v=sum/1.42e8; printf("折合体积为: %f立方米\n",v); //对结果进行输出 return 0; } 运行结果:

2. 求完数。 程序2:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6的因子为1,2,3,而6=1+2+3,因此6是“完数”。编程找出1000之内的所有完数,输出所有的完数(要求:一行显示6个数); 程序代码: #include int main() { int i,j,sum,n=0; printf(" 1000以内的完数有:\n"); for(i=1;i<=1000;i++) { sum=0; for(j=1;j

网络程序设计实验报告-Winsock编程接口实验

网络程序设计 实验报告 实验名称: Winsock编程接口实验 实验类型:____验证型实验_____ __ 指导教师:______________________ 专业班级:_____________________ 姓名:_______________________ 学号:_____________________ 电子邮件:____________ 实验地点:______ _______ 实验日期2013 年 3 月29 日 实验成绩:__________________________

一、实验目的 ●掌握Winsock的启动和初始化; ●掌握gethostname(),gethostbyname(),GetAdaptersInfo()等信息查询函数的使用。 二、实验设计 由实验内容可以知道: 1、编写程序能同时实现对多个域名的解析。比如在控制台输入:getip https://www.wendangku.net/doc/7011662101.html, https://www.wendangku.net/doc/7011662101.html,,能输出https://www.wendangku.net/doc/7011662101.html,和https://www.wendangku.net/doc/7011662101.html,对应的IP地址列表。 2、编写程序获取并输出本地主机的所有适配器的IP地址,子网掩码,默认网关,MAC 地址。 首先要了解一些基本的知识gethostname(),gethostbyname(),GetAdaptersInfo()等信息查询函数的基本知识gethostbyname()返回对应于给定主机名的包含主机名字和地址信息的hostent结构指针。结构的声明与gethostaddr()中一致。 之后要根据内容画出函数流程图

三、实验过程(包含实验结果) 1.在实验过程中调用GetAdaptersInfo()时,出现了undeclared identifier的报错,原因是没有包含其头文件,之后进行一些修改解决了问题. 2.实验结果 3.选择查看本机信息 四、讨论与分析 1.Winsock初始化的作用是什么? 答:使用winsock初始化可加载winsock编程的动态链接库。

主机端口扫描程序设计

主机端口扫描程序设计 摘要 计算机信息网络的发展加速了信息化时代的进程,但是随着社会网络化程度的增加,对计算机网络的依赖也越来越大,网络安全问题也日益明显。端口扫描技术是发现安全问题的重要手段之一。 本程序是在Windows系统中使用C语言用MFC完成的一个端口扫描程序。此程序主要完成了TCP connect()扫描和UDP扫描功能。TCP扫描支持多线程,能对单个指定的主机进行扫描或对指定网段内的主机进行逐个扫描。能扫描特定的部分端口号或对指定的端口段内的端口进行逐个扫描。此端口扫描程序能快速地进行TCP扫描,准确地检测出对TCP协议开放的端口。而对于UDP扫描只支持单线程,速度较慢。扫描结果以列表的形式直观地展现出来。 关键词:端口扫描、TCP扫描、UDP扫描、TCP多线程扫描

目录 1引言 (1) 1.1 课题的背景及意义 (1) 1.2 端口扫描现状 (1) 2系统设计 (1) 2.1 系统主要目标 (1) 2.2 开发环境及工具 (1) 2.3 功能模块与系统结构 (2) 3系统功能程序设计 (4) 3.1 获取本机IP (4) 3.2 分割字符串函数的实现 (4) 3.3 获取待扫描的IP地址 (5) 3.4 获取待扫描的端口号 (5) 3.4.1 指定端口号的初始化 (6) 3.4.2 指定端口号的保存 (7) 3.5 TCP CONNECT()扫描 (8) 3.5.1 基本原理 (8) 3.5.2 扫描多个主机多端口多线程的实现 (8) 3.5.3 扫描结果的显示 (9) 3.6 UDP扫描 (10) 3.6.1 基本原理 (10) 3.6.2 计算效验和 (11) 3.6.3 发送UDP数据包 (11) 3.6.4 接收ICMP数据包 (12) 4测试报告 (12) 4.1 TCP扫描检测 (12) 4.1.1扫描本机 (12) 4.1.2扫描网络中其他主机 (13) 4.1.3 扫描IP段 (13) 4.2 UDP扫描检测 (14) 4.2.1 扫描本机 (14) 4.1.2扫描网络中其他主机 (15) 4.3 TCP、UDP一起扫描 (16) 结论 (17) 参考文献 (17)

网络编程实验报告

实验一TCP Socket API程序设计 一、预备知识 1.网络编程基本概念 网络上的计算机间的通讯,实质上是网络中不同主机上的程序之间的通讯。在互联网中使用IP地址来标识不同的主机,在网络协议中使用端口号来标识主机上不同进程,即使用(IP地址,端口号)二元组。 套接字(Socket)用于描述IP地址和端口,是一个通信链的句柄,通信时一个网络程序将要传输的一段信息写入它所在主机的Socket中,该Socket通过与网络接口卡相连的传输介质将这段信息发送到另一台主机的Socket中,以供其他程序使用。 图1-1 TCP通信流程 2.TCP通信流程 TCP程序是面向连接的,程序运行后,服务器一直处于监听状态,客户端与

服务器通信之前必须首先发起连接请求,由服务器接收请求并在双方之间建立连接后才可以互相通信。 二、实验目的 1.了解Winsock API编程原理; 2.掌握TCP Socket程序的编写; 3.了解C/S模式的特点; 4.学会解决实验中遇到的问题。 三、实验任务 使用Winsock API相关类实现TCP Socket通信程序,并能成功运行。 四、实验环境及工具 1. Windows2000/XP/7 2. Visual C++开发平台 3. Visual Studio2010 五、实验内容和步骤 参照《Visual C++网络编程教程》书中81页,TCP Socket API程序设计。 连接: void CChatClientDlg::OnConnect() { WSADATA wsd; //WSADATA结构 WSAStartup(MAKEWORD(2,2),&wsd); //加载协议,使用Winsock 2.2版 m_client = socket(AF_INET,SOCK_STREAM,0); //创建流式套接字 //服务器地址 sockaddr_in serveraddr; UpdateData(); if(ServerIP.IsBlank()) { AfxMessageBox("请指定服务器IP!"); return; } if(sPort.IsEmpty()) { AfxMessageBox("请指定端口!"); return; }

基于多线程的端口扫描程序课程设计报告

滁州学院 课程设计报告 课程名称: 设计题目:基于多线程的端口扫描程序 院部:计算机与信息工程学院 专业:网络工程 组别:第六组 起止日期: 2012 年12月31日~2013 年1月6日指导教师: 计算机与信息工程学院二○一二年制

课程设计任务书 目录 1 需求分析. 0 1..1 网络安全 0 1.2 课程背景 0 1.3 扫描器 0 1.4 多线程扫描器介绍 (1) 错误! 未定义书签。

错误! 未定义书签。 错误! 未定义书签。 错误! 未定义书签。 1.5 端口扫描 (2) 2 概要设计. (3) 2.1 整体框架设计 (3) 2.2 流程图描述 (3) 3 详细设计. (3) 3.1 端口扫描线程启动 (3) 3.2 GUI 图形界面 (5) 3.3 按钮监听及异常处理 (6) 4 调试与操作说明. (8) 4.1 运行界面 (8) 4.2 扫描结果 (8) 4.3 错误提示 (8) 5 课程设计总结与体会. (8) 6 参考文献. (9) 7 致谢. (9) 8 附录. 0 1 需求分析 1..1 网络安全二十一世纪是信息化、网络化的世纪,信息是社会发展的重要资源。信息安全保障能力是一个国家综合国力、经济竞争实力和生存能力的重要组成部分,是世界各国在奋力攀登的制高点。网络安全是指网络系统的硬件、软件及其系统中的数据受到保护,不因偶然的或者恶意的原因而遭到破坏、更改、泄露,系统连续可靠正常地运行。网络安全包括技术领域和非技术领域两大部分: 非技术领域包括一些制度、政策、管理、安全意识、实体安全

等方面的内容; 技术领域包括隐患扫描、防火墙、入侵检测、访问控制、虚拟专用网、CA 认证、操作系统等方面的内容。这些技术的目标是保证信息的可控性、可用性、保密性、完整性、和不可抵赖性。端口扫描属于安全探测技术范畴,对应于网络攻击技术中的网络信息收集技术。 1.2 课程背景 随着Internet 的不断发展,信息技术已成为促进经济发展、社会进步的巨大推动力。端口扫描技术是网络安全扫描技术一个重要的网络安全技术。与防火墙、入侵检测系统互相配合,能够有效提高网络的安全性。安全扫描是安全技术领域中重要的一类。通过扫描能自动检测远端或本地主机系统信息,包括主机的基本信息(如计算机名、域名、组名、操作系统 型等)、服务信息、用户信息以及漏洞信息,它的重要性在于能够对网络进行安全评估,及时发现安全隐患,防患于未然。 网络的安全状况取决于网络中最薄弱的环节,任何疏忽都有可能引入不安全的因素,最有效的方法是定期对网络系统进行安全分析,及时发现并修正存在的脆弱,保证系统安全。 国外安全扫描技术的历史可以追溯到20 世纪90 年代,当时因特网刚刚起步,但是在过去的十年内,扫描技术飞速发展,迄今为止,其扫描技术已经非常完善,但是在全面性,隐蔽性和智能性上还有待提高。安全扫描从最初专门为UNIX 系统而编写的一些只有简单功能的小程序发展到现在,已经出现了可以运行多个操作系统平台上的,具有复杂功能的系统程序。 国内的扫描技术是在国外的扫描器基础上发展起来的。其中有一些专门从事安全技术的公司。这些公司的扫描器以硬件为主,其特点是执行速度快,不像软件一样受到安装主机系统的限制。 然而对于更多的基于主机的端口扫描而言,简单,实用,可靠才是它们的长处。 1.3 扫描器扫描器是一种自动检测远程或本地主机安全性弱点的程序,通过使用扫描器你可以不留痕迹的发现远程服务器的各种TCP端口的分配。这就能让我们间接的或直观的了解到远程主机所存在的安全问题。为了保证网络中计算机的安全性,必须采取主动策略, 快速、及时、准确、安全的检测出网络中计算机及防火墙开放的和未开放的端口。计算机端口扫描技术就是这种主动防御策略实现的重要技术手段。 扫描器采用模拟攻击的形式对目标可能存在的已知安全漏洞进行逐项检查。目标可以是工作站、服务器、交换机、数据库应用等各种对象。然后根据扫描结果向系统管理员提供周 密可靠的安全性分析报告,为提高网络安全整体水平产生重要依据。在网络安全体系的建设中,安全扫描工具花费低、效果好、见效快、与网络的运行相对对立、安装运行简单,可以大规模减少安全管理员的手工劳动,有利于保持全网安全政策的统一和稳定。 1.4 多线程扫描器介绍 在java 中,组件放置在窗体上的方式是完全基于代码的。组件放置在窗体上的方式通常不是通过绝对坐标控制,而是由“布局管理器”根据组件加入的顺序决定其位置。每个容器都有一个属于的自己布局管理器。使用不同的布局管理器,组件大小,位置和形状将大不相同。表格型布局管理器将容器划分成为一个多行多列的表格,表格的大小全部相同,是由其中最大的组件所决定。通过add 方法可以将组件一一放在每个表格

端口扫描程序设计

网络安全程序设计结课论文端口扫描程序设计

目录 第一章序言 (3) 第二章系统设计 (5) 2.1 运行环境及语言 (5) 2.2系统功能 (6) 2.3程序运行流程图 (6) 2.4 程序设计过程 (6) 2.41创建工程 (6) 2.42 主机端口扫描程序设计流程 (8) 2.43主要代码 (9) 2.5运行结果测试 (15) 第三章总结及心得 (16) 3.1 总结 (16) 3.2 心得体会 (16) 第四章参考文献 (16)

第一章序言 1.1 背景 Internet快速的发展,为我们带来了方便同时也带给了我们信息安全担忧。在计算机信息安全管理中可以通过端口扫描收集系统的信息来自动监测远程或本地主机安全性弱点的程序,可以发现远程服务器的各种tcp端口的分配及提供的服务与他们的软件版本。从而让管理员间接的或直观的了解到远程主机所存在的安全问题。从而端口扫描技术得到人们的重视。 1.2目的 该文章对端口扫描技术的原理和应用进行了阐述,并设计了一个简单的基于windows平台上的端口扫描系统。此程序主要完成了TCP connect()扫描和UDP扫描功能。TCP扫描支持多线程,能对单个指定的主机进行扫描或对指定网段的主机进行逐个扫描。能扫描特定的部分端口号或对指定的端口段的端口进行逐个扫描。此端口扫描程序能快速地进行TCP扫描,准确地检测出对TCP协议开放的端口。而对于UDP扫描只支持单线程,速度较慢。扫描结果以列表的形式直观地展现出来。 1.3端口扫描概述 网络安全探测在网络安全中起着主动防御的作用,占有非常重要的地位。网络安全探测的所有功能都是建立在端口扫描的基础

端口扫描报告

杭州电子科技大学软件学院网络工程试验报告 端口扫描报告 09109146 王子龙

1.端口及端口扫描技术简介 (2) 2.对现有端口扫描工具程序的理解 (2) 主界面 (3) 3.核心代码 (6) 4.个人总结 (13) 1.端口及端口扫描技术简介 根据提供服务类型的不同,端口分为两种,一种是TCP端口,一种是UDP端口。计算机之间相互通信的时候,分为两种方式:一种是发送信息以后,可以确认信息是否到达,也就是有应答的方式,这种方式大多采用TCP协议;一种是发送以后就不管了,不去确认信息是否到达,这种方式大多采用UDP协议。对应这两种协议的服务提供的端口,也就分为TCP 端口和UDP端口。 一台拥有IP地址的主机可以提供许多服务,比如Web服务、FTP服务、SMTP服务等,这些服务完全可以通过1个IP地址来实现。主机不只是靠IP地址来区分网络服务,因为IP 地址与网络服务的关系是一对多的关系。实际上是通过“IP地址+端口号”来区分不同的服务的。 一个端口就是一个潜在的通信通道,也就是一个入侵通道。对目标计算机进行端口扫描,能得到许多有用的信息。进行扫描的方法很多,可以是手工进行扫描,也可以用端口扫描软件进行。 在手工进行扫描时,需要熟悉各种命令。对命令执行后的输出进行分析。用扫描软件进行扫描时,许多扫描器软件都有分析数据的功能。 通过端口扫描,可以得到许多有用的信息,从而发现系统的安全漏洞。 2. 对现有端口扫描工具程序的理解 该程序是有C++编写的。C++是一种使用非常广泛的计算机编程语言。C++是一种静态数据类型检查的、支持多重编程范式的通用程序设计语言。它支持过程化程序设计、数据抽象、面向对象程序设计、制作图标等等泛型程序设计等多种程序设计风格。 该程序能够扫描主机IP的某一个端口,或者是扫描该主机IP某一范围内的端口。并且提供多次扫描功能。如果要扫描的端口很多,在扫描过程中可以暂停扫描。扫描结果在界面的下方显示。主要显示内容有IP地址、端口号、端口状态、连接次数及备注。

高级程序设计实验报告

高级程序设计 实验报告 班级 学号: 姓名: 实验名称: 指导老师: 日期:

实验十一文件和流I/O 一、实验题目:文件和流I/O 二、实验内容: 1.掌握磁盘的基本操作 2.掌握目录的基本操作 3.文件的基本操作 4.文本文件的读取和写入 5.字符串的读取和写入 6.二进制文件的读取和写入I 7. 二进制文件的读取和写入2 三、主要程序代码: 1. using System; using System.IO; using System.Collections.Generic; using System.Text; namespace实验1 { class Test { public static void Main() { DriveInfo[] allDrives = DriveInfo.GetDrives(); foreach (DriveInfo d in allDrives) { Console.WriteLine("Drive {0}", https://www.wendangku.net/doc/7011662101.html,); Console.WriteLine(" File type: {0}", d.DriveType); if (d.IsReady == true) { Console.WriteLine(" Volume label: {0}", d.VolumeLabel); Console.WriteLine(" File system: {0}", d.DriveFormat); Console.WriteLine(" Available space to current user:{0, 15} bytes",d.AvailableFreeSpace); Console.WriteLine("Total available space: {0, 15} bytes",d.TotalFreeSpace); Console.WriteLine( " Total size of drive: {0, 15} bytes ", d.TotalSize); } } Console.ReadKey();

网络端口扫描实验指导汇总

《网络端口扫描》实验指导 一、实验目的 1、学习端口扫描技术的基本原理,理解端口扫描技术在网络攻防中的应用; 2、通过上机实验,熟练掌握目前最为常用的网络扫描工具Nmap的使用,并能利用工具扫描漏洞,更好地弥补安全不足。 二、实验预习提示 1、网络扫描概述 扫描是通过向目标主机发送数据报文,然后根据响应获得目标主机的情况。根据扫描对象的不同,可以分为基于主机的扫描和基于网络的扫描2种,其中基于主机的扫描器又称本地扫描器,它与待检查系统运行于同一节点,执行对自身的检查。通常在目标系统上安装了一个代理(Agent)或者是服务(Services),以便能够访问所有的文件与进程,它的主要功能为分析各种系统文件内容,查找可能存在的对系统安全造成威胁的漏洞或配置错误;而基于网络的扫描器又称远程扫描器,一般它和待检查系统运行于不同的节点上,通过网络来扫描远程计算机。根据扫描方式的不同,主要分为地址扫描、漏洞扫描和端口扫描3类。 (1)地址扫描 地址扫描是最简单、最常见的一种扫描方式,最简单的方法是利用Ping程序来判断某个IP地址是否有活动的主机,或者某个主机是否在线。其原理是向目标系统发送ICMP回显请求报文,并等待返回的ICMP回显应答。 传统的Ping扫描工具一次只能对一台主机进行测试,效率较低,现在如Fping(Fast ping)等工具能以并发的形式向大量的地址发出Ping请求,从而很快获得一个网络中所有在线主机地址的列表。但随着安全防范意识的提供,很多路由器和防火墙都会进行限制,只要加入丢弃ICMP回显请求信息的相关规则,或者在主机中通过一定的设置禁止对这样的请求信息应答,即可对ICMP回显请求不予响应, (2)漏洞扫描 漏洞扫描是使用漏洞扫描器对目标系统进行信息查询,检查目标系统中可能包含的已知漏洞,从而发现系统中存在的不安全地方。其原理是采用基于规则的匹配技术,即根据安全专家对网络系统安全漏洞、黑客攻击案例的分析和系统管理员对网络系统安全配置的实际经验,形成一套标准的网络系统漏洞库,然后在此基础上构成相应的匹配规则,通过漏洞库匹配的方法来检查目标设备是否存在漏洞。在端口扫描后,即可知道目标主机开启的端口以及端口上提供的网络服务,将这些相关信息与漏洞库进行匹配,即可查看是否有满足匹配条件的漏洞存在。漏洞扫描大体包括CGI、POP3、FTP、HTTP和SSH漏洞扫描等。漏洞扫描的关键是所使用的漏洞库,漏洞库信息的完整性和有效性决定了漏洞扫描器的性能,漏洞库的修订和更新的性能也会影响漏洞扫描器运行的时间。 (3)端口扫描 端口是网络连接的附着点,不同的应用进程使用不同的端口,如果一个应用程序希望提供某种服务,它将自己附着在端口上等待客户请求的到来(即对端口进行监听),希望使用此服务的客户则在本地主机分配一个端口,与远程主机的服务端口连接,客户通过联系这些特殊的端口来获取特殊的服务。在网络连接中,服务器端的进程需要一直处于监听状态,并且持续使用相同端口;而客户端的进程则只需要在和服务器建立连接时动态地创建一个端口,并在连接结束后立即释放。一般来说,端口扫描的对象是前者,即作为网络服务开放的

合工大汇编语言程序设计实验报告

合肥工业大学计算机与信息学院 实验报告 课程:汇编语言程序设计专业班级:**************** 学号:********** 姓名:***** 目录

实验一 (3) 实验二 (7) 实验三 (12) 实验四 (22)

实验一Debug程序的使用 一.实验目的 1、熟悉DEBUG程序中的命令,学会在DEBUG下调试运行汇编语言源程序。 2、掌握8086/8088的寻址方式及多字节数据的处理方法。 二.实验内容 1、利用DEBUG程序中的“E”命令,将两个多字节数“003F1AE7H”和“006BE5C4H”分别送入起始地址为DS:0200H和DS:0204H两个单元中。 2、分别用直接寻址方式和寄存器间接寻址方式编写程序段,实现将DS:0200H 单元和DS:0204H单元中的数据相加,并将运算结果存放在DS:0208H单元中。要求: 本次实验的内容均在DEBUG下完成,实现数据的装入、修改、显示;汇编语言程序段的编辑、汇编和反汇编;程序的运行和结果检查。 三.实验过程和程序 实验内容一: e ds:0200 E7 1A 3F 00 e ds:0204 C4 E5 6B 00 实验内容二: (1)直接寻址方式 MOV AX,[0200] MOV BX,[0202] ADD AX,[0204] ADC BX,[0206] MOV [0208],AX MOV [020A],BX (2)寄存器间接寻址方式 MOV SI,0200H MOV DI,0204H MOV BX,0208H MOV AX,[SI] MOV DX,[SI+2] ADD AX,[DI] ADC DX,[DI+2]

算法程序设计实验报告

程序设计》课程设计 姓名:王 学号:20100034 班级:软件工程00 班 指导教师:王会青 成绩: 2010年 6 月 实验一.构造可以使n 个城市连接的最小生成树 专业:__软件工程___ 班级:__软件姓名:_王___ 学号:_20100034 完成日期:_2010/6/26 ________ 一、【问题描述】给定一个地区的n 个城市间的距离网,用Prim 算法或Kruskal 算法建立最小生成树,并计算得到的最小生成树的代价。 1 城市间的道路网采用邻接矩阵表示,邻接矩阵的存储结构定义采用课本中给出的定义,若两个城市之间不存在道

路,则将相应边的权值设为自己定义的无穷大值。 2 显示出城市间道路网的邻接矩阵。 3 最小生成树中包括的边及其权值,并显示得到的最小生成树的总代价。 4 输入城市数、道路数→输入城市名→输入道路信息→执行Kruskal 算法→执行Prim 算法→输出最小生成树 二、【问题分析】 1. 抽象数据类型结构体数组的定义: #ifnd ef ADJACENCYMATRIXED// 防止该头文件被重复引用 #define ADJACENCYMATRIXED // 而引起的数据重复定义 #define INFINITY 32767 // 最大值∞ #define MAX_VERTEX_NUM 20 // 最大顶点个数 typedef int VRType; // 权值,即边的值 typedef char InfoType; // 附加信息的类型,后面使用时会定义成一个指针 typedef char VertexType[MAX_VERTEX_NUM]; // 顶点类型 typedef enum {DG=1, DN, UDG, UDN} GraphKind; //{ 有向图,有向网,无向图,无向网} typedef struct ArcCell { VRType adj; //VRType 是顶点关系类型。对无权图,用1 或0 表示相邻否;对带权图,则为权值类型。 InfoType*info; // 该弧关系信息的指针

网络端口扫描

实验三:网络扫描 一:端口扫描 分析主机扫描或端口扫描的原理,进行扫描器扫描主机或端口实验,捕获扫描时交互的数据包,通过分析扫描数据包,验证扫描原理。 网络扫描步骤: 1.扫描目标主机识别工作状态(开/关机) 2.识别目标主机端口状态(监听/关闭) 3.识别目标主机系统及服务程序的类型和版本 4.根据已知漏洞信息,分析系统脆弱点 5.生成扫描结果报告 扫描原理分析: 因为我选择的是TCP扫描方式,TCP端口扫描的原理: 1.先来说下正常情况下TCP的三次握手 1)客户端发一个SYN包,带目的端口 2)观察下返回的包: 返回SYN/ACK包,说明端口打开在监听 返回RST/ACK包,说明端口关闭,连接重置 3)若返回SYN/ACK,客户端发一个ACK,完成这次连接 2.下面是TCP扫描的几种形式 ①开放扫描 1:TCP Connect 扫描 与目的主机建立一次TCP连接,此时目的主机会将这次连接记录到log中 方法:调用socket函数connect()连接到目标计算机上,完成一次完整的三次握手过程。如果端口处于侦听状态,那么connect()就能成功返回。 2:TCP反向ident扫描:需要建立完整的TCP连接 方法:ident 协议允许(rfc1413)看到通过TCP连接的任何进程的拥有者的用户名,即使这个连接不是由这个进程开始的。开放扫描特点:产生大量审计数据,容易被发现和屏蔽,但可靠性高。 ②半开放扫描 1:TCP SYN扫描:发送SYN包,当收到SYN/ACK包时,不回ACK包给目的主机,立刻发送RST包来终止连接, 那么一般很少会被记录,但构造SYN包需要较高权限 2.间接扫描:通过第三方IP(欺骗主机) 半开放特点:隐蔽性和可靠性在①③之间 ③隐蔽扫描 又可分为SYN/ACK扫描,FIN扫描,XMAS扫描,NULL扫描,TCP ftp proxy扫描,分段扫描等。

C++高级程序设计实验报告四(125)

西財is Jc I擊学生实验报告 学院:软件与通信工程学院 课程名称:C++高级程序设计(软件) 专业班级:12软件5班________ 姓名:____________________________ 学号:____________________________ 学生实验报告(4)

一、实验综述 1、实验目的及要求 (1)进一步理解继承与派生的概念,掌握它们的使用; (2)理解类之间的继承与派生关系,能设计并编程实现若干个相互有关联的自定义类,且对这些类进行简单的使用; (3)了解虚基类的作用与方法。 (4)掌握类的多态性与虚函数的定义与使用; (5)了解纯虚函数和抽象类的的概念和用法。实验题: (1)教材390第9题; (2)某商店有如下的几种货品:衬衣、帽子、立柜。每一种货物都有详细的说明信息。 衬衣:布料、单价、产地、库存量; 帽子:布料、样式(平顶或尖顶)、单价、产地、库存量; 立柜:木料、颜色、单价、产地、库存量; 对这些商品的操作有:商品的进库(增加库存量),商品的出库(减少库存量),该类货品总价格的计算。 要求自行设计数据结构,用类结构将上述的货品表示出来。在上一步的基础上,将上述的商品管理计算机化,完成操作要求的功能。 (3)教材414第5题; (4)声明一个Shape抽象类,在此基础上派生出 Redtangle和Circle 类,二者都使用GetArea ()函数计算对象的面积,GetPerim ()函数计算对象的周长。 实验要求: 认真完成实验题,一定要使所编写的程序运行成功,提交实验报告并上传程序,实验报告要求写出操作步骤、结果、问题、解决方法、体会等。 2、实验仪器、设备或软件 计算机、VC++6.0 office、相关的操作系统等。 二、实验过程(实验步骤、记录、数据、分析) 写明具体实施的步骤,包括实验过程中的记录、数据和相应的分析

网络编程实验报告

网络编程技术实验报告 一实验目的: 网络编程技术是计算机科学与技术专业、网络工程专业、软件工程专业的一门专业基础课程。本课程以Java技术为主讲授,Java语言是当前最流行的网络编程语言。本课程是一门实用性和综合运用性都很强的课程,实践教学环节是教学过程中必不可少的重要内容。通过实验,让学生熟悉JDK中的主要内容,掌握用JDK调试和运行程序的方法,掌握网络编程的基本思想和开发方法、面向对象编程的思想,JA V A中的基本方法和技术,能够熟练使用JA V A设计、编写程序,特别是基于TCP/IP的Socket 编程,并能运用这些知识方法完成C/S和B/S结构程序的设计工作。通过实验,提高学生使用Java语言程序设计开发的能力,提高应用面向对象技术分析和解决实际问题的能力,并在此基础上强化学生的实践意识、提高其分析问题、解决问题的能力以及动手能力和创新能力。 二实验要求 要求学生熟悉JDK中的主要内容,掌握用JDK调试和运行程序的方法,掌握网络编程的基本思想和开发方法、面向对象编程的思想,JAVA中的基本方法和技术,能够熟练使用JAVA设计、编写程序,特别是基于TCP/IP的Socket编程,并能运用这些知识方法完成C/S和B/S结构程序的设计工作。要注意培养学生良好的编程习惯,自始至终贯彻课程中所介绍的程序设计风格。为保证尽量在统一安排的上机时间内完成程序设计任务,学生应事先做问题分析,并做静态检查。学生应记录实验中所遇到的问题,并写出详细的实验报告。课前准备上机程序,上机认真调试,课后撰写实验报告,实验报告包括实验目的、实验内容、源程序、实验结果及分析。

. 实验一java基本语法 实验目的: 了解Java的数据类型,掌握各种变量的声明方式,理解运算符的优先级,掌握Java基本数据类型、运算符与表达式,掌握顺序结构、选择结构和循环结构语法的程序设计方法。 实验要求: 1、编写一个声明Java不同数据类型变量的程序。 2、编写使用不同选择结构的程序。 3、编写使用不同循环结构结构的程序。 实验内容: 1、编写一个声明Java不同数据类型变量的程序。 public class DataTypes { public static void main(String args[]) { byte b=127; short s=32767; int i=2147483647; long l=9223372036l;//为什么long表示的数比Int还小? char c='c'; float f=1.23F; double d=0.9E-3; boolean bool=true; System.out.println(" b="+b); System.out.println(" s="+s); System.out.println(" i="+i); System.out.println(" l="+l); System.out.println(" c="+c); System.out.println(" f="+f); System.out.println(" d="+d); System.out.println(" bool="+bool); }

相关文档
相关文档 最新文档