- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
燕山大学计算机网络程序设计报告精要
基础知识
1.1原始套接字
创建面向连接的TCP和创建面向无连接的UDP套接字,在接收和发送时只能操作数据部分,而不能对IP首部或TCP和UDP首部进行操作
如果想要操作IP首部或传输层协议首部,就需要调用如下socket()函数创建网络层原始套接字。
协议栈的原始套接字从实现上可以分为“链路层原始套接字”和“网络层原始套接字”两大类
链路层原始套接字
链路层原始套接字调用socket()函数创建。第一个参数指定协议族类型为PF_PACKET,第二个参数type可以设置为SOCK_RAW或SOCK_DGRAM,第三个参数是协议类型(该参数只对报文接收有意义)。
socket(PF_PACKET, type, htons(protocol))
??????参数type设置为SOCK_RAW时,套接字接收和发送的数据都是从MAC首部开始的。在发送时需要由调用者从MAC首部开始构造和封装报文数据
网络层原始套接字
socktet(PF_INET, SOCK_RAW, protocol)
//接收到的数据
网络层原始套接字接收到的报文数据是从IP首部开始的,即接收到的数据包含了IP首部, TCP/UDP/ICMP等首部, 以及数据部分。
//发送的数据
网络层原始套接字发送的报文数据,在默认情况下是从IP首部之后开始的,即需要由调用者自行构造和封装TCP/UDP等协议首部
这种套接字也提供了发送时从IP首部开始构造数据的功能,通过setsockopt()给套接字设置上IP_HDRINCL选项,就需要在发送时自行构造IP首部。
?
int val = 1;
setsockopt (sockfd, IPPROTO_IP, IP_HDRINCL, val, sizeof(val));1.2一些函数
socket()函数
socket函数是一种可用于根据指定的地址族、数据类型和协议来分配一个 HYPERLINK /view/567586.htm \t _blank 套接口的描述字及其所用的资源的 HYPERLINK /subview/15061htm \t _blank 函数。
创建原始套接字:
原始套接字的创建:
int socket ( int family, int type, int protocol );
参数:
family:协议族 这里写 PF_PACKET
type: 套接字类,这里写 SOCK_RAW
protocol:协议类别,指定可以接收或发送的数据包类型,不能写 “0”,取值如下,注意,传参时需要用 htons() 进行字节序转换。
ETH_P_IP:IPV4数据包
ETH_P_ARP:ARP数据包
ETH_P_ALL:任何协议类型的数据包
返回值:
成功( 0 ):套接字,这里为链路层的套接字
失败( 0 ):出错
实例如下:
//?所需头文件?? ?
#include?sys/socket.h?? ?
#include?netinet/ether.h?? ?
#include?stdio.h??//?perror??
int?main(int?argc, char?* argv[])?? ?
{?? ?
????int?sock_raw_fd?=?socket(PF_PACKET,?SOCK_RAW,?htons(ETH_P_ALL)?);?? ?
?? ?
????if(sock_raw_fd??0){?? ?
????????perror(socket);?? ?
????????return?-1;?? ?
????}?? ?
?????? ?
????return?0;?? ?
}???
sendto()函数
int sendto ( socket s , const void * msg, int len, unsigned int flags, const struct sockaddr * to , int tolen ) ;
sendto() 用来将数据由指定的socket传给对方主机。参数s为已建好连线的socket,如果利用UDP协议则不需经过连线操作。参数msg指向欲连线的数据内 容,参数flags 一般设0,。参数to用来指定欲传送的网络地址,参数tolen为sockaddr 的结构长度。
recvfrom()函数
本函数用于从(已连接) HYPERLINK /view/567586.htm \t _blank 套接口上接收数据,并捕获数据发送源的地址。
函数原型:
int recvfrom(socket s,void *buf,int len,unsigned int flags, struct sockaddr *from,int *from
文档评论(0)