前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >套接字

套接字

作者头像
zy010101
发布2019-05-25 19:51:51
1.2K0
发布2019-05-25 19:51:51
举报
文章被收录于专栏:程序员程序员

版权声明:本文为博主原创文章,转载请注明博客地址: https://cloud.tencent.com/developer/article/1433308

套接字当初设计的目的就是为了统一同一台计算机中进程之间的通信以及不同计算机进程之间的通信所设计的一个统一的接口。套接字最早是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所提供的方法并没有什么区别。下面是所需的头文件和函数原型。

代码语言:javascript
复制
#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不能用来操作套接字以外,其余的文件操作函数都是可以的。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年03月19日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档