套接字(socket)

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

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

类型功能
SOCK_DGRAM长度固定,无连接,不可靠的报文传递。默认协议UDP
SOCK_STREAM有序,可靠,面向连接,全双工的字节流。默认协议TCP
SOCK_RAWIP协议的数据包接口(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_INETIPv4
AF_INET6IPv6
AF_UNIXUnix域
AF_UPSPEC未指定

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

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

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值