套接字

版权声明:本文为博主原创文章,转载请注明博客地址: 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 条评论
登录 后参与评论

相关文章

  • Linux进程间通信——匿名管道

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

    zy010101
  • 函数umask

    函数umask为进程设置权限掩码。并且返回之前的掩码值。它是为数不多的没有出错返回的函数。函数原型和依赖的头文件如下所示:

    zy010101
  • UDP套接字编程——Python语言描述

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

    zy010101
  • python编程之网络基础

    1 套接字是一种具有通讯端点概念的计算机网络数据结构,网络化的应用程序在开始任何通讯之前都必须要建立套接字。

    py3study
  • selec/poll中的读写事件和epoll中的读写事件

    在Linux网络编程中,常常使用select和poll来做事件触发,监听socket的读写状态,然后进行读写操作。现在新的linux内核中,增加了epoll事件...

    李海彬
  • Python套接字

    Python只支持AF_UNIX(基于文件)、AF_NETLINK(使用标准的BSD套接字接口进行用户级别和内核级别代码之间的IPC)、AF_TIPC(透明的进...

    用户4845306
  • pythonnet-网络编程(1)

    python的网络编程有不少难点,也容易忘记,最近我会陆续发出系统、完整pythonnet知识的博客,一边复习一边分享,感兴趣的可以关注我。

    py3study
  • unix网络编程——TCP套接字编程

      TCP客户端和服务端所需的基本套接字。服务器先启动,之后的某个时刻客户端启动并试图连接到服务器。之后客户端向服务器发送请求,服务器处理请求,并给客户端一个响...

    Mister24
  • 进程间通信的历史与未来

    - START - 我们都知道线程是共享内存空间的,因此不会发生所谓的通信,而进程则存在如何防止多进程同时访问数据的排他控制问题。 5 种进程间通信的方式 ? ...

    临书
  • python-网络编程

      socket 的原意是“插座”,在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定...

    yaohong

扫码关注云+社区

领取腾讯云代金券