第8章 原始套接字编程-Windows网络编程基础教程(第2版)-杨传栋-清华大学出版社
网络编程基本技术

网络编程基本技术网络编程是指利用计算机网络进行数据传输和通信的一种编程方式。
随着互联网的发展和普及,网络编程在各个领域得到了广泛的应用。
本文将介绍网络编程的基本技术,包括套接字编程、TCP/IP协议、HTTP协议以及WebSocket技术。
一、套接字编程套接字(Socket)是网络编程中的基本概念,它是实现网络通信的一种方式。
通过套接字编程,我们可以创建一个套接字对象,并通过它进行网络数据的发送和接收。
在套接字编程中,主要包括以下几个步骤:1. 创建套接字:使用socket函数创建一个套接字对象。
2. 绑定地址:使用bind函数将套接字和本地地址绑定。
3. 监听连接:使用listen函数监听套接字,等待客户端的连接请求。
4. 接受连接:使用accept函数接受客户端的连接请求,并创建一个新的套接字用于与客户端通信。
5. 发送和接收数据:使用send和recv函数进行数据的发送和接收。
二、TCP/IP协议TCP/IP协议是互联网通信的核心协议,它包括传输层的TCP协议和网络层的IP协议。
在网络编程中,我们通常使用TCP/IP协议实现高可靠性的数据传输。
TCP协议提供了面向连接的可靠传输服务,通过建立连接、数据的分割与重组以及错误检测和纠正等机制,保证了数据的准确性和完整性。
IP协议负责实现网络互连,它通过IP地址进行节点的寻址和路由选择,确保数据能够从发送端发送到接收端。
三、HTTP协议HTTP协议是超文本传输协议,它是一种应用层协议,用于在Web 浏览器和Web服务器之间传输数据。
通过HTTP协议,我们可以获取和发送Web页面、图片、视频等资源。
HTTP协议采用客户端-服务器的模式,客户端发送HTTP请求,服务器响应请求并返回相应的数据。
HTTP请求由请求行、请求头和请求体组成,响应则由响应行、响应头和响应体组成。
四、WebSocket技术WebSocket技术是HTML5中的一种新协议,它建立在HTTP协议之上,利用浏览器和服务器之间的长连接,实现实时双向通信。
C语言中的网络编程与套接字

C语言中的网络编程与套接字网络编程是计算机科学中重要的技术领域,它允许不同的计算机之间进行数据交换和通信。
在C语言中,我们可以利用套接字来实现网络编程。
本文将介绍C语言中的网络编程与套接字,并探讨其基本概念、常用函数和实际应用。
一、网络编程基础网络编程主要涉及两个方面:服务器端和客户端。
服务器端负责监听并处理客户端的连接请求,客户端则负责与服务器建立连接并发送/接收数据。
套接字是进行网络编程的关键概念。
在C语言中,我们可以使用套接字API来创建套接字、设置套接字选项、以及进行数据收发操作。
套接字有两种类型:流套接字(SOCK_STREAM)和数据报套接字(SOCK_DGRAM),分别对应TCP和UDP协议。
二、套接字的创建和使用1. 服务器端在服务器端,首先需要创建一个套接字对象,并指定协议类型。
随后,我们需要绑定套接字到一个本地地址,并将其设置为监听模式,以等待客户端连接。
一旦有客户端连接进来,服务器端将创建一个新的套接字用于与该客户端的通信。
2. 客户端客户端需要创建一个套接字对象,并指定与服务器端相同的协议类型。
然后,我们使用套接字对象的connect函数来连接服务器端的地址。
一旦连接成功,客户端即可通过套接字进行数据收发。
三、常用套接字函数C语言提供了一系列的套接字函数,用于实现网络编程中的各种功能。
以下是其中一些常用的函数:1. socket:创建套接字,指定协议类型和通信域。
2. bind:将套接字绑定到一个指定的本地地址。
3. listen:将套接字设置为监听模式,等待客户端连接。
4. accept:接受客户端的连接请求,并创建一个新的套接字用于与客户端通信。
5. connect:与服务器端建立连接。
6. send和recv:发送和接收数据。
7. close:关闭套接字。
四、网络编程实践网络编程在实际应用中具有广泛的用途。
比如,我们可以利用它实现基于TCP的聊天室、网络文件传输、远程命令执行等功能。
Windows网络编程基础-习题解答

《Windows网络编程基础》习题解答第一章网络应用程序设计基础习题1.TCP/IP协议栈的五个层次是什么?在这些层次中,每层的主要任务是什么?解答:TCP/IP参考模型分为五个层次:应用层、传输层、网络层、链路层和物理层。
以下分别介绍各层的主要功能。
应用层是网络应用程序及其应用层协议存留的层次。
该层包括了所有与网络相关的高层协议,如文件传输协议(File Transfer Protocol,FTP)、超文本传输协议(Hypertext Transfer Protocol,HTTP)、Telent(远程终端协议)、简单邮件传送协议(Simple Mail Transfer Protocol,SMTP)、因特网中继聊天(Internet Relay Chat,IRC)、网络新闻传输协议(Network News Transfer Protocol,NNTP)等。
传输层的功能是使源端主机和目标端主机上的对等实体可以进行会话。
在传输层定义了两种服务质量不同的协议,即:传输控制协议(Transmission Control Protocol,TCP)和用户数据报协议(User Datagram Protocol,UDP)。
网络层是整个TCP/IP协议栈的核心。
它的功能是通过路径选择把分组发往目标网络或主机,进行网络拥塞控制以及差错控制。
链路层负责物理层和网络层之间的通信,将网络层接收到的数据分割成特定的可被物理层传输的帧,并交付物理层进行实际的数据传送。
物理层的任务是将该帧中的一个一个比特从一个节点移动到下一个节点。
该层中的协议仍然是链路相关的,并且进一步与链路(如双绞线、单模光纤)的实际传输媒体相关。
对应于不同的传输媒体,跨越这些链路移动一个比特的方式不同。
2.请分析路由器、链路层交换机和主机分别处理TCP/IP协议栈中的哪些层次?解答:路由器处理TCP/IP协议栈的物理层、链路层和网络层;链路层交换机处理TCP/IP协议栈的物理层和链路层;主机处理TCP/IP协议栈的物理层、链路层、网络层、传输层和应用层。
网络编程基础教程

网络编程基础教程第一章:介绍网络编程的基本概念和原理网络编程是指通过计算机网络实现程序之间的通信和数据交换的技术和方法。
在现代计算机技术中,网络编程已经成为非常重要的一部分。
网络编程主要涉及设置网络连接、数据传输和数据处理等方面。
1.1 网络编程的重要性随着互联网的快速发展,网络编程已经成为各种应用程序开发的常见需求。
无论是网页浏览器、电子邮件客户端还是移动应用程序,都需要通过网络与服务器端进行通信。
因此,掌握网络编程技术对于软件开发人员来说至关重要。
1.2 网络编程的基本原理网络编程基于计算机网络的原理,通过网络协议实现数据的传输和通信。
常见的网络协议有TCP/IP、HTTP、UDP等。
网络编程主要涉及网络套接字的创建、连接和数据交互等方面。
1.3 常见的网络编程语言网络编程涉及多种编程语言,常见的有Java、Python、C++等。
不同的语言提供了各自的网络编程库和框架,开发人员可以根据自己的需求选择合适的语言进行开发。
第二章:网络套接字的创建和使用网络套接字是网络编程中的关键概念,它用于在不同主机之间进行数据传输。
本章将介绍网络套接字的创建和使用。
2.1 网络套接字的分类网络套接字可以分为两种类型:流套接字(TCP)和数据报套接字(UDP)。
流套接字提供可靠的、面向连接的数据传输,而数据报套接字提供不可靠的、无连接的数据传输。
2.2 网络套接字的创建创建网络套接字需要指定协议族(如AF_INET或AF_INET6)和套接字类型(如SOCK_STREAM或SOCK_DGRAM)。
创建套接字的库函数通常为socket()。
2.3 网络套接字的连接TCP套接字需要进行连接操作才能进行数据传输,而UDP套接字则不需要连接。
TCP套接字的连接操作由connect()函数完成。
2.4 网络套接字的数据传输数据传输可以使用send()和recv()函数来进行。
TCP套接字提供面向流的数据传输,而UDP套接字则提供基于数据报的数据传输。
第3章 WinSock编程初步-Windows网络编程基础教程(第2版)-杨传栋-清华大学出版社

注意:
➢ 熟练掌握常用WinSock API函数的功能和使用方法是利用 Windows Socket进行网络编程的基础。
➢ 要掌握WinSock API函数,首先要记住该函数的名称与函 数的主要功能,其次要清楚各参数的类型及作用,以及函 数返回值的类型及意义,最后还要掌握函数成功执行的必 要条件,了解造成函数不能成功执行的常见原因。
➢ 不仅包括了Berkeley Sockets风格的库函数,同时也提供了 一套Windows所特有的扩展库函数,使程序员能够使用 Windows系统的消息驱动机制。
➢ 应用程序调用WinSock的API函数实现相互之间的通信,而 WinSock API函数又利用下层Windows操作系统中的网络 通信协议和相关的系统调用实现其通信功能。
1.包含WinSock头文件:在程序文件首部使用编译预处理命 令“#include”,将WinSock头文件包含进来。例如:
#include <WinSock2.h> 2.链接WinSock导入库,有两种方式:
✓ 通过在项目属性页中的“配置属性\链接器\输入”的 “附加依赖项”中直接添加导入库名字
✓ 在程序中使用预处理命令“#pragma comment”。例 如,程序要使用WinSock2时,可使用如下预处理命令: #pragma comment (lib, "Ws2_32.lib")
➢ 由于WinSock2完全兼容WinSock1,因此,当系统中安装 的是WinSock2时,程序中即可以使用WinSock1的头文件 和导入库也可以使用WinSock2的头文件和导入库,但如果 要使用只有WinSock2才有的功能,那就只能使用 WinSock2的头文件和导入库。
公开课 原始套接字编程

公开课原始套接字编程一、引言在当今互联网时代,网络编程已成为程序员必备技能之一。
本次公开课将为大家介绍原始套接字编程,通过学习本课程,你将掌握原始套接字的基本概念和实战技巧,为日后的网络编程任务奠定基础。
二、原始套接字编程基本概念1.套接字概述套接字(Socket)是应用程序与底层操作系统之间的接口,允许应用程序在网络中发送和接收数据。
套接字分为客户端和服务器端,通过套接字,客户端可以与服务器端进行通信。
2.原始套接字与封装套接字的区别原始套接字(Raw Socket)是指不经过任何协议封装的套接字,它直接使用底层网络协议(如TCP/IP)进行通信。
封装套接字(Wrapped Socket)则是将套接字包装在某种协议中,如HTTP、FTP等。
3.原始套接字编程的应用场景原始套接字编程适用于需要底层网络控制的情景,如网络数据捕获、网络数据解析等。
此外,它还常用于网络攻击防护和网络安全研究。
三、原始套接字编程实战1.创建原始套接字创建原始套接字需要使用socket函数,如:socket(AF_INET,SOCK_RAW, IPPROTO_IP)。
2.绑定套接字到端口使用bind函数将套接字绑定到指定的本地端口,如:bind(套接字,(struct sockaddr_in *)&local_addr)。
3.监听连接使用listen函数监听连接,如:listen(套接字,5)。
4.接受连接当有新的连接请求时,使用accept函数接受连接,如:accept(套接字,(struct sockaddr *)&remote_addr,& sock)。
5.发送和接收数据使用send和recv函数发送和接收数据,如:send(套接字,发送数据,发送长度);recv(套接字,接收数据,接收长度)。
6.关闭套接字在完成通信后,使用close函数关闭套接字,如:close(套接字)。
四、原始套接字编程进阶话题1.异步I/O编程在处理大量网络数据时,可以使用异步I/O编程提高程序性能,如使用poll、epoll等。
习题参考答案-Windows网络编程基础教程(第2版)-杨传栋-清华大学出版社
第1章习题1.选择题(1)答案:D(2)答案:C(3)答案:B(4)答案:C(5)答案:D(6)答案:B(7)答案:B(8)答案:D(9)答案:B(10)答案:B(11)答案:C2.填空题(1)答案:广播、单播(2)答案:路由器(3)答案:FF-FF-FF-FF-FF-FF(4)答案:目的计算机、广播地址(5)答案:路255.255.255.255、0.0.0.0(6)答案:目的端口号(7)答案:操作系统通信(8)答案:路操作系统的核心、函数库(9)答案:流式套接字、数据报套接字3.简答题(1)什么是网络协议?说出协议的三要素及它们的含义。
答:网络协议,就是指通信双方在通信时所必须遵循的用于控制数据传输的规则、标准和约定,是通信双方所使用的“语言”,它规定了有关功能部件在通信过程中的操作,定义了数据发送和数据接收的过程。
网络协议包括三方面内容。
一是“语法”,主要是指数据以及控制信息的结构或格式;第二方面内容是“语义”,它是指对构成协议的协议元素含义的具体解释;第三方面是“同步”,同步也称为“时序”,它规定了通信过程中各种事件的先后顺序。
(2)画出以太网帧结构示意图,并简要叙述以太网帧中各字段的含义。
答:以太网帧结构如下图所示:其中,目的地址,指明要接收该帧的计算机的MAC地址。
如果是一个广播帧,即该帧是广播给网络中的所有计算机的,目的地址应指明为广播地址。
源地址字段,用于指明发送该帧的计算机的MAC地址。
通过源地址,收到该帧的计算机就会知道是哪台计算机发送了该帧。
类型字段主要用于指明接收端对数据部分的处理方式,也就是说,接收端收到数据后,如果经过检验没发现错误,帧中的数据应该交给哪个程序处理。
数据字段,也被称为用户数据,是网络真正要传送的内容,长度在46~1500个字节之间。
校验码是接收方用来检查数据在传输过程中是否出错的,也称为帧校验序列(FCS),由发送方根据帧的其他部分的内容使用某种算法计算得到。
网络编程的基础知识
网络编程的基础知识随着互联网的高速发展和普及,网络编程在当前的软件开发中已经成为了一个非常重要的方面。
网络编程能够实现客户端与服务器之间的通讯,实现数据传输、共享、处理等一系列操作。
本文将主要讨论网络编程的基础知识,包括套接字、TCP/IP协议、HTTP协议等内容,以期为初学者提供一些帮助。
一、套接字在网络编程中,套接字是一种软件编程接口,它通过一组API与操作系统进行交互,实现了网络中不同设备之间的通信。
套接字将网络中的通信看作是一组相互连接的“端点”,并提供了一种通用的方法来管理这些端点。
通过套接字,应用程序可以读取和写入数据,实现客户端和服务器之间的通讯。
在网络编程中,套接字可以分为两种类型:流套接字(SOCK_STREAM)和数据报套接字(SOCK_DGRAM)。
流套接字提供了一种面向连接的、可靠的、有序的数据传输方式;而数据报套接字则提供了无连接的、不可靠的、无序的数据传输方式。
不同的套接字类型适用于不同的网络应用场景,我们需要根据具体的需求来选择应该使用哪种套接字类型。
二、TCP/IP协议TCP/IP协议是一种广泛应用于Internet的协议组。
TCP/IP协议包含了一系列的协议,如IP协议、TCP协议、UDP协议等。
其中,TCP协议和UDP协议是应用层面向网络的两种主要协议,它们是网络编程中最为常用的协议。
TCP协议是一种可靠的、面向连接的传输协议。
通过TCP协议,可以实现数据可靠传输,即数据包必定能够按照发送顺序到达接收方;并且能够实现流控制和拥塞控制,防止数据包冲击网络导致网络拥堵。
TCP协议广泛应用于需要可靠传输的网络应用程序中,如文件传输、电子邮件通讯等。
UDP协议则是一种不可靠的、无连接的传输协议。
通过UDP协议,可以实现快速的数据传输,但数据包不一定能够按照发送顺序到达接收方,而且在传输过程中可能会发生丢包或重复发送数据包的情况。
UDP协议广泛应用于实时性要求较高的网络应用程序中,如实时视频通话、网络游戏等。
网络编程基础教程
网络编程基础教程在现代计算机科学中,网络编程一直是重要的部分。
无论是我们日常使用的社交网络、购物网站,还是各种金融交易和数据传输,都不可缺少网络编程的支持。
因此,对于计算机科学学习者来说,学好网络编程是非常必要的。
基本概念网络编程是指在网络上实现不同计算机之间数据交换的过程。
它涉及到多个主题,包括网络基础架构、编程模型、网络协议、套接字等。
在网络编程中,套接字是重要的概念。
套接字是协议的一种实现,它在网络套接字上提供了一种应用接口,用于发送和接收数据。
编程模型在网络编程中,有两种主要的编程模型:客户端-服务器模型和点对点(P2P)模型。
在客户端-服务器模型中,客户端向服务器发送请求,并获得服务器的响应。
这种模型是现代网络中最常见的编程模型。
在点对点模型中,每个计算机都可以作为客户端和服务器,它们可以在互相之间进行通信。
网络协议网络协议是网络编程的基础。
一个协议定义了一组规则,用于在网络上通信。
TCP/IP是最常用的网络协议,它提供了一种可靠的数据传输方式。
其它常见的协议包括HTTP、FTP和SMTP等。
套接字编程套接字编程是网络编程中最重要的部分。
套接字是网络编程中传输数据的主要方法。
当应用程序需要与另一个应用程序进行通信时,它会创建一个套接字用于在网络上传输数据。
在套接字编程中,有两种类型的套接字:流式套接字和数据报套接字。
流式套接字是一种经典的套接字类型,它使用TCP/IP协议在网络上进行数据传输。
这种套接字可以实现可靠数据传输,且可以在收到数据并发送响应后关闭连接。
数据报套接字是另一种套接字类型,它使用UDP协议在网络上进行数据传输。
这种套接字比流式套接字更加灵活,但也更加不可靠。
数据报套接字适用于需要快速传输数据的应用程序。
总结网络编程是现代计算机科学中最重要的部分之一。
学好网络编程需要我们掌握一个广泛的知识范围,包括网络基础架构、编程模型、网络协议、套接字编程等。
在学习过程中,我们应该重视实践,多写网络编程相关的代码,不断提高自己的编程技能。
网络编程基础
网络编程基础网络编程是指使用计算机网络进行程序开发的过程。
随着互联网的普及,网络编程逐渐成为计算机科学中重要的领域。
本文将从网络协议、套接字编程等方面介绍网络编程的基础知识。
一、网络协议在网络编程中,网络协议是进行数据通信的规则。
常见的网络协议有TCP/IP协议、HTTP协议、FTP协议等。
其中,TCP/IP协议是互联网最核心的协议,它提供了可靠的数据传输机制,确保数据的准确传递。
HTTP协议是超文本传输协议,用于在客户端和服务器之间传输超文本数据。
FTP协议则用于在客户端和服务器之间进行文件传输。
二、套接字编程套接字编程是一种常用的网络编程方式,它用于实现应用程序之间的数据交换。
套接字是网络编程中的一个重要概念,用于描述网络中的端点。
在套接字编程中,服务器端和客户端通过创建套接字来进行通信。
服务器通过一个固定的端口监听客户端发来的请求,而客户端则通过连接服务器的IP地址和端口来与服务器进行通信。
三、网络通信模型常见的网络通信模型有两种:客户端-服务器模型和对等模型。
1. 客户端-服务器模型在客户端-服务器模型中,客户端通过发送请求,服务器通过提供服务来进行数据交互。
客户端和服务器之间的通信是单向的,客户端发送请求,服务器返回响应。
这种模型适用于服务器为多个客户端提供相同服务的场景,如Web服务器为客户端提供网页内容的请求。
2. 对等模型对等模型中,网络中的各个节点都是对等的,可以在任何节点之间进行直接沟通和数据交换。
在对等模型中,每个节点既可作为客户端发送请求,又可作为服务器接收请求。
这种模型适用于点对点的通信,如文件传输、聊天等应用。
四、网络编程框架在进行网络编程时,可以使用一些成熟的网络编程框架来简化开发工作。
常见的网络编程框架有Java的Socket编程、Python的Twisted框架、C#的Socket编程等。
这些框架提供了一些封装好的函数和类,使得开发者可以更方便地进行网络通信。
五、网络安全性在进行网络编程时,网络安全性是一个非常重要的问题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
➢ 原始套接字是在传输层之下使用的套接字,原始套接所提供 的特殊功能主要包括:
1)可对ICMP、IGMP等较低层次的协议直接访问,直接发 送或接收ICMP、IGMP等协议的报文。
2)能够接收一些TCP/IP栈不能处理的特殊的IP分组,通常 是网络核心不能识别IP分组的协议字段。
3)通过设置原始套接字的IP_HDRINCL选项,可以发送用 户自定义分组首部的IP分组,因此可编写测试基于IP的高 层网络协议。
如果参数protocol指定为IPPROTO_ICMP或 IPPROTO_UDP等这种即不是IPPROTO_IP(值为0)也不 是IPPROTO_RAW(值为255)的值,发送数据时,系统 将会按照该参数指定的协议类型自动构造IP分组首部,而 不用自己填充。
接收数据时,系统只会将首部协议字段值和该参数值相同 的IP分组交给该原始套接字。因此,一般来说,要想接收 或发送哪个协议的数据包,就应该在创建套接字时将参数 protocol指定为哪个协议。
8.2 原始套接字的通信流程
➢ 原始套接字的通信是基于IP 分组的,因而是无连接、 不可靠的,其编程流程与 数据报套接字类似。
➢ 一般情况下,WinSock的 原始套接字只能接收到运 载ICMP报文、IGMP报文 和TCP/IP不能识别内容的 IP分组,要想接收运载TCP 报文段和UDP数据报的IP 分组,需要对原始套接字 的选项进行设置。
创建一个原始套接字时,如果将参数protocol指定为 IPPROTO_RAW,则所创建的原始套接字只能用来发送IP 包,而不能接收任何数据,而且要发送的数据需要自己填 充IP首部。
如果将参数protocol指定为IPPROTO_IP,则所创建的原 始套接字可用于接收任何IP分组,但IP分组的校验和验证 和协议分析等需要由程序自己完成。
➢ 需要编程者对TCP/IP协议的原理有较为深入的理解。
8.2.1创建原始套接字
➢ 创建原始套接字所使用的函数仍然是socket()或 WSASocket(),但用于指定套接字类型的第二个参数应使用 SOCK_RAW。使用socket()函数和WSASocket()函数创建 原始套接字的格式如下: int sockROW=socket(AF_INET, SOCK_RAW, protocol); SOCKET sockROW=WSASocket(AF_INET, SOCK_RAW, protocol,0,0,0);
4)可通过原始套接字将网卡设置为混杂模式,从而能够接 收所有流经网卡接口的IP分组,达到进行网络监听的目的。
➢ 正是由于具有这些强大的功能,原始套接字被广泛应用于 高级网络编程,是黑客常用的一种编程手段,像是著名的 网络抓包工具sniffer、拒绝服务攻击(DOS)、IP欺骗等 都可以使用原始套接字编程实现。
原始套接字 SOCK_RAW
用户空间
TCP
UDP
IP
网络核心
内核空间
➢ Windows对原始套接字的支持是从WinSock2开始的。
➢ 早期使用WinSock2的Windows操作系统,例如 Windows98、Windows 2000等,可以提供对原始套接字 的完美支持。但是,处于安全方面的考虑,从Windows XP sp2开始对原始套接字的使用进行了一些限制,这些限制主 要有两个方面:
发送数据 创建原始套接字
socket()
构造 要发送的数据包
发送数据包
关闭套接字 closesocket()
接收数据 创建原始套接字
socket()
设定 套接字选项
接收数据
解析/过滤数据
关闭套接字 closesocket()
➢ 使用原始套接字编程通常较为复杂,这是因为,发送数据 时要进行复杂的数据包首部字段的构造与填写,接收数据 时又涉及数据包首部中各字段的分析解释。
第8章 原始套接字编程
8.1 原始套接字及其功能
➢ 套接字有流式套接字(SOCK_STREAM)、数据报套接 字(SOCK_DGRAM)和原始套接字(SOCKET_RAW)三 种类型。
✓ 流式套接字是基于TCP协议的,主要应用于那些对数据通 信的可靠性要求较高的应用程序;
✓ 而数据报套接字是基于UDP协议的,主要应用于那些对 数据通信的可靠性要,原始套接字直接置“根”于操作系统内核的网 络核心(Network Core),因而可对IP分组直接操控;而 流式套接字和数据报套接字则分别“悬浮”于TCP协议和 UDP协议的外围,只能通过这两个传输层协议完成数据通 信功能。
应用程序
流式套接字 数据报套接字 SOCK_STREAM SOCK_DGRAM
✓ 流式套接字和数据报套接字可以满足绝大多数应用程 序的需求,
✓ 但是,对于那些需要对通信协议有较多控制的应用, 或是那些用来测试新的传输协议的应用,
✓ 由于需要对IP首部的某些字段以及新协议的首部格式进 行直接控制,流式套接字和数据报套接字就无能为力 了。
✓ 原始套接字(Raw Socket)提供了一些流式套接字和 数据报中套接字所不能提供的特殊功能,可很好地解 决上面的问题。
✓ 用户必须具备管理员权限才能创建原始套接字;
✓ 不允许使用原始套接字发送TCP数据包,也不允许通过原 始套接字发送伪造源IP地址的UDP数据包。
➢ 需要强调,Windows7的有些版本以及Windows8和 Windows10要求必须具有管理员身份才能创建原始套接 字,因此,在调试本章例题时应以管理员权限启动VS。
➢ 第三个参数protocol用来指明创建的原始套接字所能接收 或发送的IP分组的协议字段的协议类型,可取如下值: ✓ IPPROTO_ICMP:表示ICMP协议。 ✓ IPPROTO_IGMP:表示IGMP协议。 ✓ IPPROTO_TCP:表示TCP协议。 ✓ IPPROTO_UDP:表示UDP协议。 ✓ IPPROTO_IP:原始IP协议,该类原始套接字可用于接 收任何的IP数据包。 ✓ IPPROTO_RAW:原始IP协议,该类socket只能用来 发送IP包,而不能接收任何的数据。发送的数据需要自 己填充IP包头,并且自己计算校验和。