套接字

版权声明:本文为博主原创文章,转载请注明博客地址: https://blog.csdn.net/zy010101/article/details/88673990

套接字当初设计的目的就是为了统一同一台计算机中进程之间的通信以及不同计算机进程之间的通信所设计的一个统一的接口。套接字最早是UC Berkeley为BSD操作系统设计的。现在POSIX标准化了套接字。在Linux和Unix下的套接字是一致的。但是在Windows下,微软为Windows操作系统的应用层和传输层设计了自己独有的一套机制,同时微软也扩展了POSIX标准制定的套接字,形成了Windows独有的WinSocket。

套接字是通信端点的一种抽象。在Linux下socket是文件的一种。也就是说可以使用read和write函数去处理套接字。POSIX标准支持的套接字类型如下表所示:

类型

功能

SOCK_DGRAM

长度固定,无连接,不可靠的报文传递。默认协议UDP

SOCK_STREAM

有序,可靠,面向连接,全双工的字节流。默认协议TCP

SOCK_RAW

IP协议的数据包接口(IP层接口)

SOCK_SEQPACKET

和SOCK_STREAM类似,只不过是报文,而非字节流

字节流是无法分辨报文界限的,而报文传输直接可以获取发送方所发的数据。

需要注意的是SOCK_RAW它提供的并非是传输层的套接字接口,它所提供的接口位于TCP/IP协议栈的网络层。也就是说,这时候传输层被越过了,需要应用程序开发者自行设计自己的协议头。在Linux下创建一个原始套接字的时候,需要拥有超级用户权限,用来防止恶意程序。

在Linux下,我们使用函数socket来创建一个套接字,这和Python所提供的方法并没有什么区别。下面是所需的头文件和函数原型。

#include<sys/socket.h>
int socket(int domain,int type,int protocol);

domain(域):它是用来确定通信特性的,一般给出地址格式。POSIX定义了下面的域。

地址格式

AF_INET

IPv4

AF_INET6

IPv6

AF_UNIX

Unix域

AF_UPSPEC

未指定

最后这个AF_UPSPEC实质上是通用的,在早期有些平台支持其他协议。但是现在TCP/IP成为了网络的实际标准。

socket的第二个参数就是表1给出的套接字类型,但是在实现的时候,可以自有增加其他类型的支持。

protocol通常是0,表示给给定的域和套接字类型选择默认的协议。这在同一域和套接字类型的时候是有用的,可以指定选择某一个特定的协议。

socket函数返回一个套接字描述符,本质上是一个文件描述符。一般而言,除了lseek不能用来操作套接字以外,其余的文件操作函数都是可以的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券