《原始套接字编程》课程设计报告

合集下载

计算机网络课程原始套接字编程实验的实践探索

计算机网络课程原始套接字编程实验的实践探索

计算机网络课程原始套接字编程实验的实践探索摘要:简述计算机网络课程及实验体系的发展状况,指出原有实验模式的不足,改革实验体系并新增了部分原始套接字实验模块,以网络嗅探程序设计为例给出原始套接字程序设计实验的目的、要求和实现方法,分析总结了原始套接字实验的特色和优势。

关键词:网络实验;原始套接字;协议分析;综合设计作为计算机科学与技术、软件工程、网络工程等专业重要的学位课和考研课,计算机网络课程在我校开设已整整20年,先后历经多次课程和实验体系改革,在IT人才培养和专业建设方面发挥着重要作用。

1990年,计算机网络课程在我校计算机应用87级本科班正式开设;1996年,计算机网络课程从OSI开放式系统互连模型转向到TCP/IP协议体系;2001年,计算机网络课程实施双语教学并成为我校首批双语示范课程;2003年,Cisco网络技术引入网络课程教学;2004年,计算机网络课程被评为校优质课和首批校级精品课。

2004年以后,计算机网络实验课程主要采用Java套接字编程和思科网络配置管理相结合,在学生动手能力培养方面取得了积极效果。

然而,Java套接字技术只能进行应用层编程,路由配置管理则只关注网络互连设备的操作管理,这对于理解底层网络协议是不够的。

在此背景下,课程组对网络实验课程进行了改革,在原有实验环节中增加了原始套接字实验,将操作、验证、分析和设计结合起来,在提高动手能力的同时,加深了学生对于网络协议的理解和运用。

1计算机网络课程实验体系目前,我院网络课程体系包括了计算机网络原理、TCP/IP协议分析、网络安全、路由与交换、无线网络技术、网络编程以及网络管理等7门专业课程。

其中,计算机网络原理为必修课和研究生入学统考课,面向计算机科学与技术、通信工程、软件工程等专业开设,而不同专业的后续网络课程安排有所差异。

从有利于学生综合素质和创新能力的培养角度出发,课程组对计算机网络原理实验课程进行了调整,增加了两个原始套接字编程设计实验,将网络编程深入到底层协议,旨在强化学生深入理解网络协议和报文格式。

(完整版)tcp套接字编程

(完整版)tcp套接字编程

Perror(“recv() error!\n”);
break;

else
printf("recv buf is:%s\n” ,buf);

close(sockfd);

实验结论、心得体会
1.在写客户端时,将清零函数bzero()置于给服务器赋值之前,导致连接出错。
经过仔细检查发现问题所在。
2.写服务器端时,将客户端地址长度len本为 socklen_t定义为Int型,出错。

close(connfd)
}
close(sockfd);

客户端源代码如下:
#include 〈stdio.h>
#include <string.h〉
#include <errno.h〉
#include 〈unistd。h>
#include <netinet/in。h〉
#include <netdb.h>
#include<arpa/inet。h〉
#include〈stdlib.h〉
#define MAXDATASIZE100
#define PORT2345
int main()
{
int sockfd, connfd;
struct socБайду номын сангаасaddr_in server, server;
struct sockaddr_inclient;
socklen_tlen;
char buf[MAXDATASIZE];
char sendbuf[MAXDATASIZE];
int i, num,j;
int opt=SO_REUSEADDR;

计算机网络实验原理实验四web服务器套接字编程实验报告

计算机网络实验原理实验四web服务器套接字编程实验报告

云南大学软件学院实验报告实验四、web服务器套接字编程实验报告1.实验目的:编写一个WEB服务器程序,可以接受来自浏览器的访问,并传输页面(包含多个对象)到浏览器。

掌握Socket编程。

2.实验环境:连入局域网络的主机一台。

3.实验指导:超文本传输协议(HTTP)是位于TCP/IP 协议的应用层,是最广为人知的协议,也是互连网中最核心的协议之一。

HTTP协议是Web浏览器和Web服务器之间的应用层协议,是通用的、无状态的、面向对象的协议。

一个完整的HTTP协议会话过程包括四个步骤:✧连接Web浏览器与Web服务器建立连接,打开一个称为Socket(套接字)的虚拟文件,此文件的建立标志着连接建立成功;✧请求Web浏览器通过Socket向Web服务器提交请求。

HTTP的请求一般是GET或POST 命令(POST用于FORM参数的传递);✧应答Web浏览器提交请求后,通过HTTP协议传送给Web服务器。

Web服务器接到后,进行事务处理,处理结果又通过HTTP传回给Web浏览器,从而在Web浏览器上显示出所请求的页面;✧关闭连接应答结束后Web浏览器与Web服务器必须断开,以保证其它Web浏览器能够与Web 服务器建立连接。

4.实验分析,回答下列问题。

运行课本中Webserver.java程序。

查找资料,写出程序源代码,并加上必要的注释。

如能改写该程序,附上修改后的源代码。

代码:import java.io.*;import .*;import java.util.*;class Webserver{public static void main(String arg[]) throws Exception{String requestMessageLine;String filename;ServerSocket listenSocket=new ServerSocket(2222);Socket connectionSocket=listenSocket.accept();BufferedReader inFromClient=new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));DataOutputStream outToClient=new DataOutputStream(connectionSocket.getOutputStream());requestMessageLine=inFromClient.readLine();StringTokenizer tokenizerLine=new StringTokenizer(requestMessageLine);if(tokenizerLine.nextToken().equals("GET")){filename=tokenizerLine.nextToken();if(filename.startsWith("/")==true)filename=filename.substring(1);File file=new File(filename);int numOfBytes=(int)file.length();FileInputStream inFile=new FileInputStream(filename);byte[] fileInBytes=new byte[numOfBytes];inFile.read(fileInBytes);outToClient.writeBytes("HTTP/1.0 200 Document Follows\r\n");if(filename.endsWith(".jpg"))outToClient.writeBytes("Content-Type:image/jpeg\r\n");if(filename.endsWith(".gif"))outToClient.writeBytes("Content-Type:image/gif\r\n");//图片outToClient.writeBytes("Content-Length:"+numOfBytes+"\r\n");outToClient.writeBytes("\r\n");outToClient.write(fileInBytes,0,numOfBytes);connectionSocket.close();}else System.out.println("Bad Resquest Message");}}提示:使用WEB浏览器来测试WEB服务器的程序,如果在本机上测试,本机服务器监听端口为6789,要获得本机上文件名为index.html,应在浏览器指定下列URL http://localhost:6789/index.html;如果服务器程序不在本机上,服务器监听端口为6789,要获得服务器上文件名为index.html,应在浏览器指定下列URL http://服务器IP地址:6789/index.html截图:打开网页四、实验总结总结你在实验过程中遇到的问题和解决的方法。

web服务器套接字编程实验报告

web服务器套接字编程实验报告

实验四 web服务器套接字编程实验报告序号:姓名:学号:成绩一、实验目的编写一个WEB服务器程序,可以接受来自浏览器的访问,并传输页面(包含多个对象)到浏览器。

掌握Socket编程。

二、实验环境连入局域网络的主机一台。

三、实验指导超文本传输协议(HTTP)是位于TCP/IP 协议的应用层,是最广为人知的协议,也是互连网中最核心的协议之一。

HTTP协议是Web 浏览器和Web服务器之间的应用层协议,是通用的、无状态的、面向对象的协议。

一个完整的HTTP协议会话过程包括四个步骤:✧连接Web浏览器与Web服务器建立连接,打开一个称为Socket(套接字)的虚拟文件,此文件的建立标志着连接建立成功;✧请求Web浏览器通过Socket向Web服务器提交请求。

HTTP的请求一般是GET或POST命令(POST用于FORM参数的传递);✧应答Web浏览器提交请求后,通过HTTP协议传送给Web服务器。

Web服务器接到后,进行事务处理,处理结果又通过HTTP传回给Web浏览器,从而在Web浏览器上显示出所请求的页面;关闭连接应答结束后Web浏览器与Web服务器必须断开,以保证其它Web浏览器能够与Web服务器建立连接。

四、实验分析,回答下列问题运行课本中Webserver.java程序。

查找资料,写出程序源代码,并加上必要的注释。

如能改写该程序,附上修改后的源代码。

程序源代码:import java.io.*;import .*;import java.util.*;class Webserver{public static void main(String arg[]) throws Exception{ String requestMessageLine; //定义应答信息的类型String filename; //定义文件名的类型ServerSocket listenSocket=new ServerSocket(3000); //开一个端口为3000的SERVER SOCKETSocket connectionSocket=listenSocket.accept(); //接收用户端的SOCKETBufferedReader inFromClient=new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); //用BufferedReader读取客户端传过来的信息DataOutputStream outToClient=new DataOutputStream(connectionSocket.getOutputStream()); //数据输出流,输出到客户端requestMessageLine=inFromClient.readLine(); //读客户端传来的字符串StringTokenizer tokenizerLine=new StringTokenizer(requestMessageLine); //类型转换调用函数,转换应答信息if(tokenizerLine.nextToken().equals("GET")){filename=tokenizerLine.nextToken();if(filename.startsWith("/")==true)filename=filename.substring(1);File file=new File(filename);int numOfBytes=(int)file.length();FileInputStream inFile=new FileInputStream(filename);byte[] fileInBytes=new byte[numOfBytes];inFile.read(fileInBytes);//读出数据段的字节数outToClient.writeBytes("HTTP/1.0 200 Document Follows\r\n");if(filename.endsWith(".jpg"))//判断文件的类型是否是jpg类型outToClient.writeBytes("Content-Type:image/jpeg\r\n");if(filename.endsWith(".gif"))//判断文件的类型是否是jpg类型outToClient.writeBytes("Content-Type:image/gif\r\n");outToClient.writeBytes("Content-Length:"+numOfBytes+" \r\n");outToClient.writeBytes("\r\n");outToClient.write(fileInBytes,0,numOfBytes);connectionSocket.close();//关闭连接}else System.out.println("Bad Resquest Message");//服务器没有返回请求应答信息}}提示:使用WEB浏览器来测试WEB服务器的程序,如果在本机上测试,本机服务器监听端口为3000,要获得本机上文件名为index.html,应在浏览器指定下列URL http://localhost:3000/index.htm。

信息安全实践第十一次作业 原始套接字、解析

信息安全实践第十一次作业 原始套接字、解析

四川大学计算机学院、软件学院
实验报告
学号:姓名:专业:__软件工程__ 班级:第 12 周
{
tcph=(struct tcphdr*)(buffer+sizeof(struct ether_header)+sizeof(struct ip));
printf("Sourport:%d\n",ntohs(tcph->source));
printf("Destport :%d\n",ntohs(tcph->dest));
}
}
}
}
这里主要修改的地方是:
1、原代码问题:在输出ip那部分需要利用inet_ntop函数,不然程序运行出问题。

2、加入了TCP头部解封,输出源端口和目的端口,当然还要把相应的头文件加入。

其实只要把上面这程序和这次的syn flood结合起来再做点修
*((u_char*)&oddbyte)=*(u_char*)ptr;
sum+=oddbyte;
}
sum = (sum>>16)+(sum & 0xffff);
sum = sum + (sum>>16);
answer=(short)~sum;
return(answer);
}
下面让我们看一下运行效果:
运行syn flood程序,使用不同的伪装IP攻击:
然后检验结果:
数据记录
和计算
结论
通过(结果)。

网络通信编程 原始套接字程序设计

网络通信编程 原始套接字程序设计

4
创建原始套接字
原始套接字类型 在IP头中使用预定义的协议(如ICMP) 在IP头中使用自定义的协议(使用IP头包含选项)
协议 地址族 套接字类型 TCP 套接字类型使用的值 SOCK_STREAM 协议字段 IPPROTO_TCP
互联网 协议 (IP)
UDP
AF_INET Raw
SOCK_DGRAM
首部的其余部分:对每一种报文类型都是特定的。
数据部分: 在差错报文中:所携带的信息可找出引起差错的原始分组; 在查询报文中:携带了基于查询类型的额外信息。
报文类型
ICMP 报文
差错报告
查询
报告路由器或主机(目的 站)在处理一个IP数据报 时可能遇到的一些问题
帮助主机或网络管理员从 一个路由器或另一个主机 得到特定的信息 它是成对出现的
第四章
原始套接字
1
内容提要
1.使用原始套接字 2.套接字选项 3.ICMP编程 4.使用IP头包含选项 5.网络嗅探器实例
2
1.使用原始套接字
利用原始套接字(Raw Socket),可访问底层传 输协议。
原始套接字(Raw Socket))与标准套接字区别
3
使用原始套接字可以做什么? 实现一些实用工具(ping,traceroute)。 可对IP头,TCP头,UDP头,ICMP头等进行操作。 原始套接字使用SOCK_RAW套接字类型来创建 的,目前只有Winsock2提供了对它的支持。 无论Microsoft Windows CE 还是老版本的 Windows 95 (无Winsock 2升级)均不能利用原 始套接字。
SO_REUSEADDR
选项值类型 bool 获取/设置 均可 Winsock版本 1+ 说明 如果是TRUE,套接字就可与一个正由其 他套接字使用的地址绑定到一起,或与处 在TIME_WAIT状态的地址绑定到一起

公开课 原始套接字编程

公开课 原始套接字编程

公开课原始套接字编程摘要:一、公开课主题介绍1.原始套接字编程简介2.公开课的主要内容二、原始套接字编程基本概念1.套接字的发展历史2.原始套接字与标准套接字的区别3.套接字编程的重要性三、套接字编程基础1.套接字类型及其区别2.套接字函数库及其功能3.套接字编程的基本流程四、原始套接字编程实例分析1.服务器端编程2.客户端编程3.通信过程演示五、原始套接字编程的应用领域1.网络通信2.数据传输3.网络安全六、总结与展望1.原始套接字编程的意义2.套接字编程在我国的发展现状3.未来套接字编程的发展趋势正文:一、公开课主题介绍本次公开课的主题是“原始套接字编程”。

在互联网技术高速发展的今天,套接字编程已经成为网络通信领域的重要技术之一。

原始套接字编程作为套接字编程的基础,对于深入理解网络通信原理具有重要意义。

本次公开课将详细讲解原始套接字编程的相关知识,帮助大家更好地掌握这一技术。

二、原始套接字编程基本概念套接字编程是一种网络编程技术,通过使用套接字(socket)实现不同计算机之间的数据传输。

套接字起源于UNIX 系统,经过多年的发展,已经成为各种操作系统都支持的一种标准编程接口。

原始套接字和标准套接字是套接字编程的两种主要形式,它们之间的主要区别在于对网络协议的支持程度。

原始套接字编程更接近于底层网络协议,能够实现更高效、更灵活的网络通信。

随着互联网的普及,套接字编程的应用领域越来越广泛,涵盖了网络通信、数据传输、网络安全等多个方面。

学习和掌握原始套接字编程,不仅能够提高个人的编程技能,还能为我国互联网产业的发展贡献力量。

三、套接字编程基础套接字编程的基础知识包括套接字类型、套接字函数库和套接字编程的基本流程。

套接字类型主要有流式套接字(SOCK_STREAM)、数据报套接字(SOCK_DGRAM)和原始套接字(SOCK_RAW)等,它们分别适用于不同的网络协议。

套接字函数库提供了大量用于实现套接字编程的函数,如socket、bind、listen、accept、send、recv 等。

套接字编程实验报告

套接字编程实验报告

一、实验目的1. 理解套接字编程的基本原理和概念。

2. 掌握TCP和UDP协议在套接字编程中的应用。

3. 能够使用套接字编程实现简单的网络通信。

二、实验环境1. 操作系统:Windows 102. 编程语言:C3. 开发环境:Visual Studio 2019三、实验内容1. 创建套接字2. 绑定套接字3. 监听套接字4. 接受连接5. 发送数据6. 接收数据7. 关闭套接字四、实验步骤1. 创建套接字```c#include <stdio.h>#include <stdlib.h>#include <sys/socket.h>#include <netinet/in.h>#include <string.h>int main() {int sockfd;sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) {perror("socket error");exit(1);}printf("Socket created successfully\n"); return 0;}```2. 绑定套接字```c#include <stdio.h>#include <stdlib.h>#include <sys/socket.h>#include <netinet/in.h>#include <string.h>int main() {int sockfd;struct sockaddr_in servaddr;sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0) {perror("socket error");exit(1);}memset(&servaddr, 0, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(8080);servaddr.sin_addr.s_addr = htonl(INADDR_ANY);if (bind(sockfd, (struct sockaddr )&servaddr, sizeof(servaddr)) < 0) {perror("bind error");exit(1);}printf("Socket bound successfully\n");return 0;}```3. 监听套接字```c#include <stdio.h>#include <stdlib.h>#include <sys/socket.h>#include <netinet/in.h>#include <string.h>int main() {int sockfd, newsockfd;struct sockaddr_in servaddr, cliaddr;socklen_t len;sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0) {perror("socket error");exit(1);}memset(&servaddr, 0, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(8080);servaddr.sin_addr.s_addr = htonl(INADDR_ANY);if (bind(sockfd, (struct sockaddr )&servaddr, sizeof(servaddr)) < 0) {perror("bind error");exit(1);}listen(sockfd, 5);printf("Socket listening on port 8080\n");len = sizeof(cliaddr);newsockfd = accept(sockfd, (struct sockaddr )&cliaddr, &len);if (newsockfd < 0) {perror("accept error");exit(1);}printf("Connection accepted from %s:%d\n",inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port)); return 0;}```4. 接受连接```c#include <stdio.h>#include <stdlib.h>#include <sys/socket.h>#include <netinet/in.h>#include <string.h>int main() {int sockfd, newsockfd;struct sockaddr_in servaddr, cliaddr;socklen_t len;sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0) {perror("socket error");exit(1);}memset(&servaddr, 0, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(8080);servaddr.sin_addr.s_addr = htonl(INADDR_ANY);if (bind(sockfd, (struct sockaddr )&servaddr, sizeof(servaddr)) < 0) {perror("bind error");exit(1);}listen(sockfd, 5);printf("Socket listening on port 8080\n");len = sizeof(cliaddr);newsockfd = accept(sockfd, (struct sockaddr )&cliaddr, &len);if (newsockfd < 0) {perror("accept error");exit(1);}printf("Connection accepted from %s:%d\n",inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));return 0;}```5. 发送数据```c#include <stdio.h>#include <stdlib.h>#include <sys/socket.h>#include <netinet/in.h>#include <string.h>int main() {int sockfd, newsockfd;struct sockaddr_in servaddr, cliaddr;socklen_t len;char buffer[1024];sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0) {perror("socket error");exit(1);}memset(&servaddr, 0, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(8080);servaddr.sin_addr.s_addr = htonl(INADDR_ANY);if (bind(sockfd, (struct sockaddr )&servaddr, sizeof(servaddr)) < 0) {perror("bind error");exit(1);}listen(sockfd, 5);printf("Socket listening on port 8080\n");len = sizeof(cliaddr);newsockfd = accept(sockfd, (struct sockaddr )&cliaddr, &len); if (newsockfd < 0) {perror("accept error");exit(1);}printf("Connection accepted from %s:%d\n",inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));memset(buffer, 0, sizeof(buffer));read(newsockfd, buffer, sizeof(buffer));printf("Received: %s\n", buffer);write(newsockfd, "Hello, client!", strlen("Hello, client!")); close(newsockfd);close(sockfd);return 0;}```6. 接收数据```c#include <stdio.h>#include <stdlib.h>#include <sys/socket.h>#include <netinet/in.h>#include <string.h>int main() {int sockfd, newsockfd;struct sockaddr_in servaddr, cliaddr;socklen_t len;char buffer[1024];sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0) {perror("socket error");exit(1);}memset(&servaddr, 0, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(8080);servaddr.sin_addr.s_addr = htonl(INADDR_ANY);if (bind(sockfd, (struct sockaddr )&servaddr, sizeof(servaddr)) < 0) {perror("bind error");exit(1);}listen(sockfd, 5);printf("Socket listening on port 8080\n");len = sizeof(cliaddr);newsockfd = accept(sockfd, (struct sockaddr )&cliaddr, &len);if (newsockfd < 0) {perror("accept error");exit(1);}printf("Connection accepted from %s:%d\n",inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));memset(buffer, 0, sizeof(buffer));read(newsockfd, buffer, sizeof(buffer));printf("Received: %s\n", buffer);write(newsockfd, "Hello, client!", strlen("Hello, client!")); close(newsockfd);close(sockfd);return 0;}```7. 关闭套接字```c#include <stdio.h>#include <stdlib.h>#include <sys/socket.h>#include <netinet/in.h>#include <string.h>int main() {int sockfd, newsockfd;struct sockaddr_in servaddr, cliaddr;socklen_t len;char buffer[1024];sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0) {perror("socket error");exit(1);}memset(&servaddr, 0, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(8080);servaddr.sin_addr.s_addr = htonl(INADDR_ANY);if (bind(sockfd, (struct sockaddr )&servaddr, sizeof(servaddr)) < 0) {perror("bind error");exit(1);}listen(sockfd, 5);printf("Socket listening on port 8080\n");len = sizeof(cliaddr);newsockfd = accept(sockfd, (struct sockaddr )&cliaddr, &len);if (newsockfd < 0) {perror("accept error");exit(1);}printf("Connection accepted from %s:%d\n",inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));memset(buffer, 0, sizeof(buffer));read(newsockfd, buffer, sizeof(buffer));printf("Received: %s\n", buffer);write(newsockfd, "Hello, client!", strlen("Hello, client!"));close(newsockfd);close(sockfd);return 0;}```五、实验总结通过本次实验,我们掌握了套接字编程的基本原理和概念,学会了如何使用套接字实现简单的网络通信。

网络通信编程 原始套接字程序设计

网络通信编程 原始套接字程序设计

➢SO_BROADCAST
选项值类型 bool
获取/设置 均可
Winsock版本 1+
说明
如果指定的套接字已经配置成收发广播数 据,对这个套接字选项进行查询,就会返 回TRUE。随SO_BROADCAST一起使用 setsockopt,便可在这个套接字上启用广播 通信功能。
对于非SOCK_STREAM类型的所有套接字
➢ 协议标志IPPROTO_UDP、IPPROTO_IP以及 IPPROTO_RAW均要求使用套接字选项IP_HDRINCL, 而该选项在上述平台下都是不支持的。
➢ Windows 2000提供了对IP_HDRINCL选项的支持,所以 能够处理IP头(IPPROTO_RAW)、TCP头(IPPROTO_TCP) 以及UDP头(IPPROTO_UDP)。
A
9
选项级别: 协议的层次对应选项级别 应用层:SOL_SOCKET 传输层:IPPROTO_TCP、IPPROTO_UDP 网络层:IPPROTO_IP 不同级别属性不同,同一级别的不同协议的属
性不同,因此必须指定level参数 例:Int nTime=2*1000
setsockopt(s,SOL_SOCKET,SO_RCVTIMEO,(char*)&n Time,sizeof(nTime))
第四章
原始套接字
A
1
内容提要
▪ 1.使用原始套接字 ▪ 2.套接字选项 ▪ 3.ICMP编程 ▪ 4.使用IP头包含选项 ▪ 5.网络嗅探器实例
A
2
1.使用原始套接字
▪ 利用原始套接字(Raw Socket),可访问底层传 输协议。
▪ 原始套接字(Raw Socket))与标准套接字区别

06网络程序设计_原始套接字课件

06网络程序设计_原始套接字课件

16:30:11
15
例:ping程序: 发送ICMP Echo Request包 接收ICMP包并解析需要的Echo Response包 通过IP_OPTIONS套接字选项,实现记录路由选 项。 指定发送的数据包大小
16:30:11
16

ICMP header structure
13
Ping
常用Ping来判断特定主机是否处于活动状态,并且是否可
以通过网络访问。 通过生成一个ICMP“回应请求”(Echo Request),并将其 定向至打算查询的目标主机。 发出ICMP回应请求以后,远程机器收到这个请求,然后 生成一条回应答复消息( Echo Response ),再通过网络 传回。 出于某些原因,不能抵达目标主机,就会生成对应的 ICMP错误消息,由原先打算建立通信的那个路径上某个 路由器返回。 假定与远程主机的物理性连接并不存在问题,但远程主机 已经关机或没有设置对网络事件作出响应(防火墙),此 时需由程序来执行超时检测。
16:30:11
20
实现Traceroute程序的方法 基本思想:多次发送数据包,TTL递增,TTL 为0 时返回一条 ICMP报文。 两种方法:发UDP数据报和ICMP数据包。 例:路由跟踪程序(采用发送UDP数据包) 创建两个套接字: sRaw 用于接收ICMP数据包 sSend用于发送TTL不断增加的UDP数据报
SOCK_DGRAM
SOCK_RAW
IPPROTO_UDP
IPPROTO_RAW IPPROTO_ICMP ……
创建原始套接字 使用socket()或WSASocket()创建原始套接字。
16:30:11

信息安全系统实践第十一次作业原始套接字、

信息安全系统实践第十一次作业原始套接字、

四川大学计算机学院、软件学院
实验报告
学号:姓名:专业:__软件工程__ 班级:第 12 周
{
tcph=(struct tcphdr*)(buffer+sizeof(struct ether_header)+sizeof(struct ip));
printf("Sourport:%d\n",ntohs(tcph->source));
printf("Destport :%d\n",ntohs(tcph->dest));
}
}
}
}
这里主要修改的地方是:
1、原代码问题:在输出ip那部分需要利用inet_ntop函数,不然程序运行出问题。

2、加入了TCP头部解封,输出源端口和目的端口,当然还要把相应的头文件加入。

其实只要把上面这程序和这次的syn flood结合起来再做点修
*((u_char*)&oddbyte)=*(u_char*)ptr;
sum+=oddbyte;
}
sum = (sum>>16)+(sum & 0xffff);
sum = sum + (sum>>16);
answer=(short)~sum;
return(answer);
}
下面让我们看一下运行效果:
运行syn flood程序,使用不同的伪装IP攻击:
然后检验结果:
数据记录
和计算
结论
通过(结果)。

Java UDP套接字编程实验报告

Java UDP套接字编程实验报告

广州大学学生实验报告开课学院及实验室:电子楼418A 室2014年 11 月 20 日学院计算机学院年级、专业、班网络工程113班姓名曾俊峰学号实验课程名称网络编程成绩实验项目名称UDP套接字编程指导老师樊志平一、实验目的UDP是面向无连接的传输层协议,不保证数据传输的可靠性,如果需要可靠传输,可以在应用层实现。

通过本实验,使学生熟悉UDP协议应用编程范型,掌握Java对UDP协议的支持类,并能熟练结合多线程、输入输出流等类库的使用和面向对象分析与设计技术加以解决实际问题,提高学生综合运用所学知识的能力。

二、使用仪器、器材微机一台操作系统:WinXP编程软件:Myeclipse三、实验内容及原理DatagramSocket→发送数据报的套接字DatagramPacket→存储数据的数据报一、DatagramSocket1、public void receive(DatagramPacket p)从此套接字接收数据报包。

当此方法返回时,DatagramPacket 的缓冲区填充了接收的数据。

数据报包也包含发送方的IP 地址和发送方机器上的端口号。

2、public void send(DatagramPacket p)从此套接字发送数据报包。

DatagramPacket 包含的信息指示:将要发送的数据、其长度、远程主机的IP 地址和远程主机的端口号。

二、DatagramPacket1、DatagramPacket(byte[] buf, int length) 接收数据报→构造DatagramPacket,用来接收长度为length 的数据包。

字节数组buf 用来存储接收到的数据2、DatagramPacket(byte[] buf, int length, InetAddress address, int port) 发送数据报→构造数据报包,用来将长度为length 的包发送到指定主机上的指定端口号。

实验套接字编程实验

实验套接字编程实验

注意:实验课程名称统一填写“计算机网络实验”
实验 2
实验项目名称:套接字编程实验
实验日期:
实验地点:
实验目的:
1.理解套接字的概念,区分TCP套接字和UDP套接字;
2.掌握Python语言下的套接字编程技术。

实验内容:
1.参照教材
2.7的内容,分别利用TCP和UDP套接字编程技术,
使用Python语言编程完成从客户端输入一行字符,发送到服务器后,由服务器转化成大写字母,回送到客户端并显示。

2.调试、运行所建立的程序。

3.回答习题31、32的问题。

实验步骤:
1.预备知识:Python语言编程基础、Python语言网络编程技术;
2.下载Python语言及其集成开发工具并安装;
3.输入Python源程序并保存、运行调试;
4.分别在不同主机上或同一台主机下运行服务器程序和客户机程
序,观察客户机和服务器的通信交互过程。

5.完成实验报告,内容包括源程序和运行界面。

附:操作运行界面
(1)TCP客户端运行界面
(2)TCP服务器端运行界面
(3)UDP客户端运行界面
(4)UDP服务器端运行界面。

套接字编程实验报告

套接字编程实验报告

Programing 实验物联2班201208080228 赵智慧一、实验题目:利用套接字编程,编写出TCP和UDP的客户机、服务器程序进行交互二、实验代码:1.TCP服务器:package TCP;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import .ServerSocket;import .Socket;public class TCPServer {public static void main(String[] args) throws IOException{ServerSocket server=new ServerSocket(7999);System.out.println("server ok");Socket socket=server.accept();BufferedReader bf=new BufferedReader(new InputStreamReader(socket.getInputStream()));String str=bf.readLine();while(str!=null){System.out.println(str);str=bf.readLine();}}}2.TCP客户机:package TCP;import java.io.BufferedReader;import java.io.DataOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintWriter;import .Socket;import .UnknownHostException;public class TCPClient {public static void main(String[] args) throws UnknownHostException, IOException{String sentence;InputStreamReader isr = new InputStreamReader(System.in);BufferedReader inFromUser = new BufferedReader(isr);Socket clientSocket = new Socket("127.0.0.1",7999);sentence = inFromUser.readLine();OutputStream os = clientSocket.getOutputStream();PrintWriter oos=new PrintWriter(os);os.write(sentence.getBytes());clientSocket.close();}}3.UDP服务器:package UDP;import .DatagramPacket;import .DatagramSocket;import .InetAddress;import .SocketException;public class UDPServer {public static void main(String[] args) throws Exception{DatagramSocket serverSocket = new DatagramSocket(9876); //所有发送和接收的数据都将通过该套接字//因为UDP无连接,所以无需创建一个新的套接字监听新的请求byte[] receive1 = new byte[1024];byte[] receive2 = new byte[1024];byte[] send1 = new byte[1024];byte[] send2 = new byte[1024];byte[] send3 = new byte[1024];while(true){DatagramPacket receivePacket = new DatagramPacket(receive1, receive1.length);serverSocket.receive(receivePacket);String str = new String(receivePacket.getData()); //从分组中提取出数据,并存入str中InetAddress ip = receivePacket.getAddress(); //提取IP地址int port = receivePacket.getPort(); //提取客户机端口号String ask = "请选择:1.将其转化为大写 2.将a字符替换为c字符";send1 = ask.getBytes();DatagramPacket sendPacket1 = new DatagramPacket(send1, send1.length, ip,port);serverSocket.send(sendPacket1);DatagramPacket receivePacket2 = new DatagramPacket(receive2, receive2.length);serverSocket.receive(receivePacket2);String str2 = new String(receivePacket2.getData());if(str2.toCharArray()[0]=='1'){String capitalizedSentence = str.toUpperCase();send3 = capitalizedSentence.getBytes();DatagramPacket sendPacket3 = new DatagramPacket(send3, send3.length, ip,port);serverSocket.send(sendPacket3);}else{String change = str.replace('a', 'c');send2 = change.getBytes();DatagramPacket sendPacket2 = newDatagramPacket(send2, send2.length, ip,port);serverSocket.send(sendPacket2);}}}}4.UDP客户机:package UDP;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import .DatagramPacket;import .DatagramSocket;import .InetAddress;import .SocketException;import .UnknownHostException;public class UDPClient {public static void main(String[] args) throws IOException{InputStreamReader isr = new InputStreamReader(System.in);BufferedReader inFromUser = new BufferedReader(isr);DatagramSocket clientSocket = new DatagramSocket(); //客户机套接字InetAddress IPAddress = InetAddress.getByName("127.0.0.1");byte[] sendData1 = new byte[1024];byte[] sendData2 = new byte[1024];byte[] receiveData1 = new byte[1024];byte[] receiveData2 = new byte[1024];String sentence = inFromUser.readLine();sendData1 = sentence.getBytes();DatagramPacket sendPacket = new DatagramPacket(sendData1, sendData1.length,IPAddress,9876);clientSocket.send(sendPacket);DatagramPacket receivePacket1 = new DatagramPacket(receiveData1, receiveData1.length);clientSocket.receive(receivePacket1);String modifiedData1 = new String(receivePacket1.getData());System.out.println("Server:"+modifiedData1);String sentence2 = inFromUser.readLine();sendData2 = sentence2.getBytes();DatagramPacket sendPacket2 = new DatagramPacket(sendData2, sendData2.length,IPAddress,9876);clientSocket.send(sendPacket2);DatagramPacket receivePacket2 = new DatagramPacket(receiveData2, receiveData2.length);clientSocket.receive(receivePacket2);String modifiedData2 = new String(receivePacket2.getData());System.out.println("Server:"+modifiedData2);clientSocket.close();}}三、实验分析:TCP提供可靠的数据传输,而UDP提供不可靠的运输服务,在套接字编程方面,UDP 客户机使用的是DatagramSocket,而TCP客户机使用的是Socket。

c原始套接字实现数据包捕捉课程设计报告

c原始套接字实现数据包捕捉课程设计报告

网络协议分析课程设计---用原始套接字实现IP数据报捕捉专业班级:网络工程1班姓名:****学号:*********指导教师:2012年1月6日目录一、项目打算书............................................................................................ 错误!未定义书签。

二、需求分析书............................................................................................ 错误!未定义书签。

三、项目设计说明书.................................................................................... 错误!未定义书签。

四、软件功能及操作说明书........................................................................ 错误!未定义书签。

五、测试分析与报告.................................................................................... 错误!未定义书签。

六、课程设计心得........................................................................................ 错误!未定义书签。

一、项目打算书1.编写目的IP数据包是网络协议学习进程中容易接触到的,选择那个题目一是为了将自己的所学知识加以运用,二是希望通过探讨实践去实现题目,在实践和实际的项目中提高自己的编程能力。

2.项目简介在通常情形下,网络通信的套接字程序只能响应与自己硬件地址相匹配的或是以广播形式发出的数据帧,关于其他形式的数据帧比如已抵达网络接口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址以后将不引发响应,也确实是说应用程序无法收取与自己无关的的数据包。

【VIP专享】计算机网络套接字编程实验报告

【VIP专享】计算机网络套接字编程实验报告

2、向服务器发送服务请求报文,等待并接收应答;继续提出请求……
3、请求结束后关闭通信通道并终止。

面向连接的应用程序流程图:
3、实验内容:
分别用TCP和UDP实现套接字编程,实现小写字母转大写!
4、实验结果与分析:
实验包含四个程序,如下:
TCPClient:
TCPServer: 
UDPClient:
UDPSever:
程序运行结果:
需要把hostname改成主机IP地址,用ipconfig命令可得到本地IP。

运行结果:
思考题:
在一台主机上安装编译用java写的TCPClient和UDPClient程序,在另一台主机上安装编译TCPServer和UDPServer程序。

那么1:在运行TCPCserver运行TCPClient会发生什么现象?为什么?
2:在运行UDPCserver运行UDPClient会发生什么现象?为什么?
3:如果你对客户机端和服务器端使用了不同的端口,将发生什么现象?
答: 1.2.3都什么都不会发生,因为tcp、udp server程序无非是绑定了一个特定的端口,但是client端使用的端口都是随机产生的,不必要client 和server 的tcp和udp端口必须一致。

5、实验总结:
通过本次实验,让我更加深入的了解了套接字编程实现的细节,对TCP、UDP协议原理也有了更深刻的理解。

同时学会使用了java编程的流程,在实验编码中,遇到了不少错误,但都不断改进调试最后成功,还有hostname只用本地IP最直接,当然,也可以换别的主机的地址。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《原始套接字编程》课程设计报告姓名:***班级:9班学号:********《原始套接字编程》课程设计报告班级:11级9班学号:54110904 姓名:王延兴一、设计任务分析(一)实验环境操作系统:Windows编程工具及集成开发环境:VC++(二)实验目的和要求实验目的:掌握原始套接字编程。

实验要求:完成下列功能:(1)利用RAW SOCKET捕获网络数据包的程序模型SOCKET_STREAM 流式套接字SOCKET_DGRAMSOCKET_RAW 原始套接字IPPROTO_IP IP协议IPPROTO_ICMP INTERNET控制消息协议,配合原始套接字可以实现ping的功能IPPROTO_IGMP INTERNET 网关服务协议,在多播中用到在AF_INET地址族下,有SOCK_STREAM、SOCK_DGRAM、SOCK_RAW三种套接字类型。

SOCK_STREAM也就是通常所说的TCP,而SOCK_DGRAM则是通常所说的UDP,而SOCK_RAW 则是用于提供一些较低级的控制的;第3个参数依赖于第2个参数,用于指定套接字所用的特定协议,设为0表示使用默认的协议。

RAW SOCKET能够对较低层次的协议直接访问,网络监听技术很大程度上依赖于它。

(2)能够抓取第二节课的并发服务器程序的服务器端或客户端的应用层数据,即:时间值,打印输出。

二、设计方案同一台主机不同进程可以用进程号来唯一标识,但是在网络环境下进程号并不能唯一标识该进程。

TCP/IP主要引入了网络地址、端口和连接等概念来解决网络间进程标识问题。

套接字(Socket)是一个指向传输提供者的句柄,TCP/IP协议支持3种类型的套接字,分别是流式套接字、数据报式套接字和原始套接字。

流式套接字(SOCKET_STREAM)提供了面向连接、双向可靠的数据流传输服务。

数据报式套接字(SOCKET_ DGRAM)提供了无连接服务,不提供无错保证。

原始套接字(SOCKET_RAW)允许对较低层次的协议直接访问,比如IP、ICMP协议,它常用于检验新的协议实现,或者访问现有服务中配置的新设备,因为RAW SOCKET可以自如地控制Windows 下的多种协议,能够对网络底层的传输机制进行控制,所以可以应用原始套接字来操纵网络层和传输层应用。

比如,我们可以通过RAW SOCKET来接收发向本机的ICMP、IGMP协议包,或者接收TCP/IP栈不能够处理的IP包,也可以用来发送一些自定包头或自定协议的IP包。

网络监听技术很大程度上依赖于SOCKET_RAW。

本实验采用原始套接字进行捕获通过本主机的包并对本主机的包进行处理。

◆各个函数功能:char * GetProtocol(int proto) //获得协议类型send(CientSocket, tmp, (int)strlen(tmp), 0);发送数据recv(CientSocket, RecvBuffer, MAX_PATH, 0);接收数据WSAStartup(MAKEWORD(2,2), &Ws) 初始化套接字类库socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 创建套接字bind(ServerSocket, (struct sockaddr*)&LocalAddr, sizeof(LocalAddr));绑定套接字listen(ServerSocket, 10);侦听,队列大小为10◆设计思想:采用原始套接字进行捕获通过本主机的包并对本主机的包进行处理。

三、详细设计头文件ip.h:详细代码://定义标准的的TCP头和IP头#define URG 0x20#define ACK 0x10#define PSH 0x08#define RST 0x04#define SYN 0x02#define FIN 0x01typedef struct _iphdr //定义IP首部{unsigned char h_verlen; //4位首部长度+4位IP版本号unsigned char tos; //8位服务类型TOSunsigned short total_len; //16位总长度(字节)unsigned short ident; //16位标识unsigned short frag_and_flags; //3位标志位unsigned char ttl; //8位生存时间TTLunsigned char proto; //8位协议(TCP, UDP 或其他)unsigned short checksum; //16位IP首部校验和unsigned int sourceIP; //32位源IP地址unsigned int destIP; //32位目的IP地址}IP_HEADER;typedef struct _tcphdr //定义TCP首部{USHORT th_sport; //16位源端口USHORT th_dport; //16位目的端口unsigned int th_seq; //32位序列号unsigned int th_ack; //32位确认号unsigned char th_lenres; //4位首部长度/6位保留字unsigned char th_flag; //6位标志位USHORT th_win; //16位窗口大小USHORT th_sum; //16位校验和USHORT th_urp; //16位紧急数据偏移量}TCP_HEADER;// 定义ICMP首部typedef struct icmp_hdr{unsigned char i_type; // 类型unsigned char i_code; // 代码unsigned short i_cksum; // 校验码unsigned short i_id; // 非标准的ICMP首部unsigned short i_seq;unsigned long timestamp;}ICMP_HEADER;typedef struct udp_hdr // 8 Bytes 定义udp首部{unsigned short uh_sport;unsigned short uh_dport;unsigned short uh_len;unsigned short uh_sum;}UDP_HEADER;源文件:详细代码:#include<stdio.h>#include<Winsock2.h>#pragma comment(lib,"ws2_32")#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)struct ip // 定义IP首部{unsigned char h_verlen; // 4位首部长度,4位IP版本号unsigned char tos; // 8位服务类型TOSunsigned short ip_length; // 16位总长度(字节)unsigned short ident; // 16位标识unsigned short frag_and_flags; // 3位标志位unsigned char ttl; // 8位生存时间TTLunsigned char proto; // 8位协议(TCP, UDP 或其他) unsigned short checksum; // 16位IP首部校验和unsigned int sourceIP; // 32位源IP地址unsigned int destIP; // 32位目的IP地址};// 定义TCP首部struct tcp{USHORT th_sport; // 16位源端口USHORT th_dport; // 16位目的端口unsigned int th_seq; // 32位序列号unsigned int th_ack; // 32位确认号unsigned char th_lenres; // 4位首部长度/6位保留字unsigned char th_flag; // 6位标志位USHORT th_win; // 16位窗口大小USHORT th_sum; // 16位校验和USHORT th_urp; // 16位紧急数据偏移量};void main(){int sock,bytes_recieved,fromlen;char buffer[65535];struct sockaddr_in from;struct ip *ip;struct tcp *tcp;WORD wVersionRequested; //版本号WSADATA wsaData; //启动SOCKET的int err;wVersionRequested = MAKEWORD( 2, 2 );//建立版本err = WSAStartup( wVersionRequested,&wsaData );//启用socketif ( err != 0 ) //如果返回值不等于0,那么表示出错,直截退出程序{return;}sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP);bool flag=true;setsockopt(sock, IPPROTO_IP, 2 , (char*)&flag, sizeof(flag));sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); //IP设置addr.sin_port=htons(0);if(SOCKET_ERROR==bind(sock,(sockaddr *)&addr,sizeof(addr))) //绑定{closesocket(sock);printf("绑定失败!");exit(0);}DWORD dwBytesRet;DWORD dwVal=1;ioctlsocket(sock, SIO_RCVALL, &dwVal); //设置网卡为混听模式int i=0;while(true){fromlen=sizeof(from);bytes_recieved=recvfrom(sock,buffer,sizeof(buffer),0,(structsockaddr*)&from,&fromlen); //接收数据i++;ip=(struct ip *)buffer; //得到ip头if(ip->proto==6) //过滤其他协议,只留下TCP协议{tcp=(struct tcp *)(buffer+(4*ip->h_verlen&0xf0>>4)); //得到tcp头printf("Ip包字节数:%d\n",bytes_recieved); //打印ip数据包长度printf("源IP:%s\n", inet_ntoa(*(in_addr*)&ip->sourceIP)); //打印源IPprintf("目的IP:%s\n", inet_ntoa(*(in_addr*)&ip->destIP)); //打印目的IPprintf("源端口:%d\n",ntohs(tcp->th_sport)); //打印源端口printf("目的端口:%d\n",ntohs(tcp->th_dport)); //打印目的端口printf("TCP的数据内容:");char* ptr=buffer+5+ 4*((tcp->th_lenres&0xf0)>>4|0); //计算数据头指针int cpysize=bytes_recieved-5- 4*((tcp->th_lenres&0xf0)>>4|0); //计算数据长度memcpy(buffer, ptr, cpysize); //取出数据for(int i = 0; i < cpysize ; i++) //打印数据{if(buffer[i] >= 32 && buffer[i] < 255){printf("%c", (unsigned char)buffer[i]);}else{printf(".");}}printf("\n");}}}运行界面:四、总结与体会掌握了利用RAW SOCKET捕获网络数据包并对其进行分析。

相关文档
最新文档