原始套接字编程接口

1.创建套接字

原始套接字可以用socket函数来创建,但第二个参数为SOCK_RAW,第三个参数protocol有用户设置,可以使用WinSock2.h中定义的前缀为IPPROTO_XXX的长值。另外,用户也可以选择一个头文件中没有定义的数值,直接在socket函数中传入数值即可。

2.设置选项

大部分选项设置与TCP/UDP套接口是一样的,有一个选项IP_HDRINCL,只试用于原始套接口,用于控制是否用户自己构造ip首部,如果设置非0值,用户自己构造ip首部及后面的数据;设置0值时,这是默认的情况,用户只需要构造ip首部之后的数据部分,ip首部有系统自动填写

3绑定套接口

在原始套接口上调用bind()函数,只是设置本地地址,系统并不关心端口值,因为原始套接口没有端口的概念。通常原始套接口不调用bind,而是在发送数据是有系统自己选择外出接口。当bind()中地址不属于本机任何网络接口时,函数会失败。

4连接套接口

函数connect设置原始套接口的目的地址,也不关心端口值,并把套接口标识为已连接,这里的已连接至表示设置了目的地址。本地地址不受connect的影响,没有调用bind()时,仍然是未设定的。

5发送数据

发送数据通常都用sendto(),在参数to中指定要发送的目的地址,如果嗲用了connect,也可以调用send发送。

6接受数据

接受数据通常使用recvfrom,如果不关心对方的地址,也可以使用recv,调用recvfrom之前必须调用过bind,connect或者sendto中的函数,将本地或目的的地址信息告诉系统,如果直接调用recvfrom,WinSock返回失败。

7关闭

关闭原始套接口与关闭其他类型的套接口是一样的,调用closesocket函数即可。

 

输出处理:

原始套接口发送数据通常用sendto(),第五个参数to中指定要发送的目的地址。如果调用过connect,目的地址已经设定,发送数据时,可以直接跳用send,当然也可以调用sendto(),并且第五个参数to设置为NULL,当to不为null,系统会把数据发送到to所指定的目的地址,但调用connect时保存在陶接口中的目的地址不会改变。这样产生的问题

是如果to中与connect的地址不同,由于这个套接口的目的地址是connect指定的,故从to中地址输入的数据报就不会再这个套接口上受到数据。

发送的目的地址可以是任何有效ip地址,包括广播或多播地址。为了向广播地址发送数据,程序必须使用选项SO_BROADCAST调用setsocketopt设置套接口才能够广播,否则send或sendto将失败,错误代码为WSAEACCESS。使用原始套接口的应用程序不需要加入一个多播组,就可以向该组播地址发送数据。

原始套接口发送的数据长度,包括ip首部在内不能大于ip协议允许的最大值(65535)

如果设置了IP_HDRINCL选项,用户需要自己构造ip首部及其后面的数据,提供给系统的数据长度也包括了ip首部在内。如果ip首部后面的数据需要校验和,则必须自己计算。

对ip首部校验和有系统计算,标识符可以设置为0,系统会设置标识符字段。Windows中填写ip首部时,各字段的值都需要使用网络字节序,这与FreeBSD的实现不同,FreeBSD的ip数据报长度ip_len,片偏移ip_off要使用主机字节序。

未设定IP_HDRINCL选项时,这也是默认值,发送数据是传给系统缓冲区是ip首部之后的数据,系统会在用户数据前增加一个ip首部,并填写ip首部中的各个字段。其中协议字段设置为调用socket函数的第三个参数,原地址是bind的本地地址,没有调用bind是,系统根据外出借口自动设置。目的地址是connect或sendto中指定的地址。

输出数据的长度超过外出网络接口的最大传送但愿MTU时,ip协议对数据分片。

 

 

输入处理:

原始套接口接受数据通常使用recvform,第五个参数from可以返回地方的地址,如果应用程序不关心对方的地址,也可以使用recv接受数据

 

对于ipv4应用程序接受的是整个ip数据报,包含ip首部,即总是指向ip首部的第一个字节,不管是否设置IP_HDRINCL选项,IP首部中的所有字节都是网络字节序。

 

如果数据报时分片的,ip协议在收到所有分片后进行重组,并把完整的数据报交给套接口。

 

在TCP/IP协议栈接受到一个完整的数据报后,他检查所有的套接口,找到与数据报中信息匹配的套接口,并把该数据报复制一份,复制到匹配的套接口中,对原始套接口,如下图的条件进行检查。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值