套接字是通信端点的抽象。与应用程序要使用文件描述符访问文件一样,访问套接字也需要套接字描述符。套接字描述符在UNIX系统是用文件描述符实现的。事实上,许多处理文件描述符的函数(如read和write)都可以处理套接字描述符。

要创建一个套接字,可以调用socket函数。

#include <sys/socket.h>
int socket(int domain, int type, int protocol);
返回值:若成功则返回文件(套接字)描述符,若出错则返回-1

参数domain(域)确定通信的特性,包括地址格式。表16-1总结了由POSIX.1指定的各个域。各个域有自己的格式表示地址,而表示各个域的常数都以AF_开头,意指地址族(address family)。

                                   表16-1 套接字通信域

多数系统还会定义AF_LOCAL域,这是AF_UNIX的别名。AF_UNSPEC域可以代表任何域。历史上,有些平台支持其他网络协议(如AF_IPX为NetWare协议族),但这些协议的域常数没有在POSIX.1标准中定义。

参数type确定套接字的类型,进一步确定通信特征。表16-2总结了由POSIX.1定义的套接字类型,但在实现中可以自由增加对其他类型的支持。

                                                         表16-2 套接字类型

参数protocol通常是0,表示按给定的域和套接字类型选择默认协议。当对同一域和套接字类型支持多个协议时,可以使用protocol参数选择一个特定协议。在AF_INET通信域中套接字类型SOCK_STREAM的默认协议是TCP(传输控制协议)。在AF_INET通信域中套接字类型SOCK_DGRAM的默认协议是UDP(用户数据报协议)。下表(摘自apue第3版)列出了为因特网域套接字定义的协议:

对于数据报(SOCK_DGRAM)接口,与对方通信时是不需要逻辑连接的。只需要送出一个报文,其地址是一个对方进程所使用的套接字。

因此数据报提供了一个无连接的服务。另一方面,字节流(SOCK_STREAM)要求在交换数据之前,在本地套接字和与之通信的远程套接字之间建立一个逻辑连接。

数据报是一种自包含报文。发送数据报近似于给某人邮寄信件。可以邮寄很多信,但不能保证投递的次序,并且可能有些信件丢失在路上。每封信件包含接收者的地址,使这封信件独立于所有其他信件。每封信件可能送达不同的接收者。

相比之下,使用面向连接的协议通常就像与对方打电话。首先,需要通过电话建立一个连接,连接建立好之后,彼此能双向地通信。每个连接是端到端的通信信道。会话中不包含地址信息,就像呼叫的两端存在一个点对点的虚拟连接,并且连接本身暗含特定的源和目的地。

对于SOCK_STREAM套接字,应用程序意识不到报文界限,因为套接字提供的是字节流服务。这意味着当从套接字读出数据时,它也许不会返回所有由发送者进程所写的字节数。最终可以获得发送过来的所有数据,但也许要通过若干次函数调用得到。

SOCK_SEQPACKET套接字和SOCK_STREAM套接字很类似,但从该套接字得到的是基于报文的服务而不是字节流服务。这意味着从SOCK_SEQPACKET套接字接收的数据量与对方发送的一致。流控制传输协议(Stream Control Transimission Portocol, SCTP)提供了因特网域上的顺序数据包服务。

SOCK_RAW套接字提供一个数据报接口用于直接访问下面的网络层(在因特网域中为IP)。使用这个接口时,应用程序负责构造自己的协议首部,这是因为传输协议(TCP和UDP等)被绕过了。当创建一个原始套接字时需要有超级用户特权,用以防止恶意程序绕过内建安全机制来创建报文。

调用socket与调用open相类似。在两种情况下,均可获得用于输入/输出的文件描述符。当不再需要该文件描述符时,调用close来关闭对文件或套接字的访问,并且释放该描述符以便重新使用。

虽然套接字描述符本质上是一个文件描述符,但不是所有参数为文件描述符的函数都可以接受套接字描述符。表16-3总结了到目前为止所讨论的大多数使用文件描述符的函数处理套接字描述符时的行为。未规定的和由实现定义的行为通常意味着函数不能处理套接字描述符。例如,lseek不处理套接字,因为套接字不支持文件偏移量的概念。

                                            表16-3 使用文件描述符的函数处理套接字时的行为

套接字通信是双向的。可以采用函数shutdown来禁止套接字上的输入/输出。

#include <sys/socket.h>
int shutdown(int sockfd, int how);
返回值:若成功则返回0,出错则返回-1

如果how是SHUT_RD(关闭读端),那么无法从套接字读取数据;如果how是SHUT_WR(关闭写端),那么无法使用套接字发送数据;使用SHUT_RDWR则将同时无法读取和发送数据。

能够使用close关闭套接字,为何还要使用shutdown呢?理由如下:首先,close只有在最后一个活动引用被关闭时才释放网络端点。这意味着如果复制一个套接字(例如采用dup),套接字直到关闭了最后一个引用它的文件描述符之后才会被释放。而shutdown允许使一个套接字处于不活动状态,无论引用它的文件描述符数目多少。其次,有时只关闭套接字双向传输中的一个方向会很方便。例如,如果想让所通信的进程能够确定数据发送何时结束,可以关闭该套接字的写端,然而通过该套接字读端仍可以继续接收数据。

本篇博文内容摘自《UNIX环境高级编程》(第2版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/

转载于:https://www.cnblogs.com/nufangrensheng/p/3564695.html

网络IPC:套接字之套接字描述符相关推荐

  1. 网络 IPC 套接字socket

    APUE书中所有实例源码下载地址:http://www.apuebook.com apue学习笔记(第十六章 网络IPC:套接字):https://www.cnblogs.com/runnyu/p/4 ...

  2. 《UNIX环境编程》第十六章--网络IPC:套接字

    Contents 套接字接口 套接字描述符 寻址 字节序 地址格式 地址查询 绑定地址 建立连接 数据传输 套接字选项 带外数据 UNIX域套接字 使用套接字的示例 面向连接的ruptime 无连接的 ...

  3. UNIX再学习 -- 网络IPC:套接字

    一.基本概念 1.编程接口 什么是伯克利套接字(Berkeley Socket)? 美国加利福尼亚大学比克利分校于 1983年发布 4.2 BSD Unix 系统.其中包含一套用 C 语言编写的应用程 ...

  4. 网络IPC:套接字之建立连接

    如果处理的是面向连接的网络服务(SOCK_STREAM或SOCK_SEQPACKET),在开始交换数据以前,需要在请求服务的进程套接字(客户端)和提供服务的进程套接字(服务器)之间建立一个连接.客户端 ...

  5. UNIX环境高级编程 学习笔记 第十六章 网络IPC:套接字

    socket的设计目标之一:同样的接口既可以用于计算机间通信,也可以用于计算机内通信.socket接口可采用许多不同的网络协议进行通信,本章讨论限制在因特网事实上的通信标准:TCP/IP协议栈. 套接 ...

  6. Python网络编程2:创建套接字和套接字对象的内建方法

    1.使用socket模块中socket()函数创建套接字: socket()函数返回一个socket对象,该对象的方法实现了各种socket系统调用. 语法: import socket socket ...

  7. java实现套接字网络编程_Java网络编程(一)Socket套接字

    一.基础知识 1.TCP:传输控制协议. 2.UDP:用户数据报协议. 二.IP地址封装 1.InetAddress类的常用方法 getLocalHost() 返回本地主机的InetAddress对象 ...

  8. Python之路(第三十一篇) 网络编程:简单的tcp套接字通信、粘包现象

    一.简单的tcp套接字通信 套接字通信的一般流程 服务端 server = socket() #创建服务器套接字server.bind() #把地址绑定到套接字,网络地址加端口server.liste ...

  9. tcp/ip网络编程--accept()函数返回的套接字

    tcp/ip网络编程–accept()函数返回的套接字 套接字:1)套接字是对网络中不同主机的应用进程之间进行双向通信的端点的抽象:一个套接字就是网络进程通信的一端.[1] 2)套接字是用来与另一个进 ...

最新文章

  1. 服务器选哪个系统,服务器选择哪个操作系统
  2. mysql获取两个表中日期字段的最小差值
  3. jquery实现滚动条滚动到一定高度导航固定不变
  4. python signal
  5. 模板题——位运算,离散化,区间合并
  6. OTDR系统的分类的特点
  7. 一阶惯性传感器的快速跟踪性能实现
  8. STM32 USART 多摩川编码器调试
  9. 更改计算机的桌面图标,电脑如何更改桌面图标 更改桌面图标方法
  10. endnote使用方法大全,endnote教程
  11. OpenHarmony开发环境WSL2配置踩坑
  12. 2022年Android官方模拟器安装Xposed教程+测试工具PatDroid安装教程
  13. 第三方登陆-------android整理知识
  14. 日语(五十元音)_01
  15. vivado报错 syntax error、dout is an unknown type
  16. KNN分类——matlab(转载)
  17. 提车二月记--小鹏P7
  18. layui 表格合计
  19. 在IDEA中使用MCR调用运行matlab代码
  20. 虚幻4(unreal engine) 雨雪粒子制作

热门文章

  1. 经典重温:FAIR提出SlowFast,用双分支非对称网络处理不同采样率的视频!代码开源!...
  2. CVPR 2020 Workshop on Continual learning in Computer Vision 征稿
  3. ICCV 2019 | 旷视提出MetaPruning:基于元学习和AutoML的模型压缩新方法
  4. 高效大规模图像搜索开源实现
  5. ajax如何处理程序设计,Struts与Ajax高级程序设计
  6. 分享几个Python小技巧函数里的4个小花招
  7. 建模师分类:选择游戏还是工业?哪个发展前景更好?
  8. 卷王李富贵算法每日一题--分治算法(三)--逃亡
  9. 一个会“说话”的油箱盖,告诉你每一滴油的去向
  10. (转)20个令人惊叹的深度学习应用