网络基础----原生套接字,域间套接字

这里写图片描述

原生(始)套接字(SOCK_RAW)

原生套接字(SOCK_RAW)可以用来自行组装IP数据包,然后将数据包发送到其他终端,也就是说原生套接字是基于IP数据包的编程。(SOCK_PACKET是基于数据链路层的编程)。另外,必须在管理员权限下才能够使用原生套接字。
原生套接口提供了普通TCP和UDP socket不能提供的3个能力:
1)进程使用raw socket可以读ICMP、IGMP等分组。这个能力还使得使用ICMP或IGMP构造的应用程序能够完全作为用户进程处理,而不必往内核中添加额外代码。
2)大多数的内核只处理IPV4数据报中一个名为协议的8位字段的值为1(ICMP)、2(IGMP)、6(TCP)、17(UDP)四种情况。然而该字段的值还有许多其他值。进程使用raw socket就可以读写那些内核不处理的IPV4数据报了,因此,可以使用原生套接字定义用户自己的协议格式。
3)通过使用raw socket,进程可以使用IP_HDRINCL套接口选项自行的构造IP头部。这个能力可用于构造特定类型的TCP或UDP分组等。

域间套接字socketpair

pipe用来创建管道,但是单个管道只能单向通信,一端用于读,而另一端用于写。如果要实现进程双向通信,必须创建一对管道,而socketpair则可以用来创建双向通信的管道,具体实现如下:
这里写图片描述

   「domain」:表示协议族,只能为AF_LOCAL或者AF_UNIX;

   「type」:表示类型,可以是SOCK_STREAM或者SOCK_DGRAM。用SOCK_STREAM建立的套接字对是管道流,与一般的管道相区别的是,套接字对建立的通道是双向的,即每一端都可以进行读写。参数sv,用于保存建立的套接字对;


   「protocol」:表示协议,只能为0;

   「sv[2]」:是接收代表两个套接口的整数数组。每一个文件描述符
   代表一个套接口,并且与另一个并没有区别。

   socketpair()函数的返回值为0时表示调用成功,为-1时表示发生了错误。

猜你喜欢

转载自blog.csdn.net/daboluo521/article/details/80697736
今日推荐