socket函数详细解析

网络程序设计中的套接字系统调用socket()用来获得文件描述符。

socket()函数的原型如下:
  int socket( int domian, int type, int protocol);
  这个函数建立一个协议族为domain、协议类型type、协议编号为protocol的套接字文件描述符。如果函数调用成功,会返回一个表示这个套接字的文件描述符,失败的时候返回-1。

函数socket()的参数domain用于设置网络通信的域,函数socket()根据这个参数选择通信协议的族。通信协议族在文件sys/socket.h中定义,包含如表所示的值,在头文件中AF_INET和PFINET的值是一致的。

SOCK_STREAM TCP连接,提供序列化、可靠的、双向连接的字节流。支持带外数据
SOCK_DGRAM 支持UDP连接(无连接状态的消息)
SOCK_SEQPACKET 序列化包,提供一个序列化的、可靠的、双向的基于连接的数据传输通道,数据长度定常。每次调用读系统调用时数据需要将全部数据读出。
SOCK_RAW RAW类型,提供原始网络协议访问
SOCK_RDM 提供可靠的数据报文,不过可能数据会有乱序
SOCK_PACKET 这是一个专用类型,不能在通用程序中使用

并不是所有的协议族都实现了这些协议类型,例如,AF_INET协议族就没有实现SOCK_SEQPACKET协议类型。
函数socket()的第三个参数protocol用于指定某个协议的特定类型,即type类型中的某个类型。通常某个协议中只有一种特定类型,这样protocol参数仅能设置为0;但是有些协议有多种特定的类型,就需要设置这个参数来选择特定的类型。

  • 类型为SOCK_STREAM的套接字表示一个双向的字节流,与管道类似。流式的套接字在进行数据收发之前必须已经连接,连接使用connet()函数进行。一旦连接,可以使用read()或者write()函数进行数据的传输。流式通信方式保证数据不会丢失或者重复接收,当数据在一段时间内仍然没有接收完毕,可以将这个连接认为已经死掉。

  • SOCK_DGRAM和SOCK_RAW这两种套接字可以使用函数sendto()来发送数据,使用recvfrom()函数接收数据,recvfrom()接收来自指定IP地址的发送方的数据。

  • SOCK_PACKET是一种专用的数据包,它直接从设备驱动接收数据。

函数socket()并不总是执行成功,有可能会出现错误,错误的产生有多种原因,可以通过errno获得,具体值和含义在如下表中列出。通常情况下造成函数socket()失败的原因是输入的参数错误造成的,例如某个协议不存在等,这时需要详细检查函数的输入参数。由于函数的调用不一定成功,在进行程序设计的时候,一定要检查返回值。

含义
EACCES 没有权限建立指定domain的type的socket
EAFNOSUPPORT 不支持所给的地址类型
EINVAL 不支持次协议或者协议不可用
EMFILE 进程文件表溢出
ENFILE 已经达到系统允许打开的文件数量,打开文件过多
ENOBUFS/ENOMEM 内存不足。socket只有到资源足够或者有进程释放内存
EPROTONOSUPPORT 指定的协议type在domain中不存在
其他

使用socket()函数的时候需要设置上述3个函数,例如将socket()函数的第一个参数domain设置为AF_INET,第二个参数设置为SOCK_STREAM,第三个参数设置为0,建立一个流式套接字。
int sock = socket(AF_INET,SOCK_STEAM,0);

socket()函数和内核函数之间的关系

用户设置套接字的参数后,函数要能够起作用,需要与内核空间的相关系统调用交互。应用层的socket()函数是和内核层的系统调用相对应的。


  图中用户调用函数sock=socket(AF_INET,SOCK_STREAM,0),这个函数会调用系统调用函数sys_socket(AF_INET,SOCK_STREAM,0)(在文件net/socket.c中)。系统调用sys_socket()分为两部分,一部分生成内核socket结构(注意与应用层的socket函数是不同的),一部分与文件描述符绑定,将绑定的文件描述符值传给应用层。内核sock结构如下(在文件linux/net.h中);
  内核函数sock_create()根据用户的domain指定的协议族,创建一个内核socket结构绑定到当前的进程上,其中的type与用户空间用户的设置值是相同的。
sock_map_fd()函数将socket结构与文件描述符列表中的某个文件描述符绑定,之后的
操作可以查找文件描述符列表来对应内核socket结构。

socket函数解析相关推荐

  1. C语言socket()函数解析(创建套接字)af地址族,ip地址类型(Address Family)INET(Inetnet)PF(Protocol Family)

    文章目录 Linux 下的 socket() 函数 1) af 为地址族(Address Family),也就是 IP 地址类型 2) type 为数据传输方式/套接字类型 3) protocol 表 ...

  2. C++ socket函数解析

    socket()函数 intsocket(int domain, int type, int protocol); socket函数对应于普通文件的打开操作.普通文件的打开操作返回一个文件描述字,而s ...

  3. 【Socket网络编程】12. send()、recv()、sendto() 和 recvfrom() 函数解析

    send().recv().sendto()和recvfrom()函数解析 一般情况下,send().recv()在TCP协议下使用,sendto().recvfrom()在UDP协议下使用,也可以在 ...

  4. socket的accept函数解析以及服务器和多个客户端的端口问题

     今天与同学争执一个话题:由于socket的accept函数在有客户端连接的时候产生了新的socket用于服务该客户端,那么,这个新的socket到底有没有占用一个新的端口? 讨论完后,才发现,自 ...

  5. socket通信函数解析

    目录 1.socket 2.bind 3.listen 4.connect 5.send 6.recv 7.select 8.setsockopt 9.closesocket 10.总结辨析 10.1 ...

  6. Socket函数说明

    第六章  Socket函数说明 6.1  库函数综述 6.1.1  套接字函数 表6.1  Windows Sockets 1.1版本的Berkeley Sockets函数 accept() 确认外来 ...

  7. linux网络编程函数解析之——setsockopt / getsockopt用法

    linux网络编程函数解析之--setsockopt / getsockopt用法 工程中无线传输方面的东西用到了setsockopt(),getsockopt().网上相关博客很多,而且类似,原文出 ...

  8. oracle rpad mysql_Oracle生成不重复票号与LPAD,RPAD与NEXTVAL函数解析

    SELECT TO_CHAR(SYSDATE,'YYMMDD')||LPAD(REFUNDSEQ.NEXTVAL,6,'0') AS RES_ORDER_NO FROM DUAL 该语句拼接 时间 与 ...

  9. json数据解析_VBA 实践指南 -- Split函数解析Json数据

    什么是JSON? JSON(JavaScript Object Notation) 是一种及其轻量级的数据交换格式,它是 ECMAScript (欧洲计算机协会制定的JavaScript规范)的一个子 ...

最新文章

  1. Java Spring Boot VS .NetCore (七) 配置文件
  2. mysql 保留两位小数
  3. java基础—IO流概述
  4. 量子计算机西南交大,交大量子光电实验室
  5. P5708 【深基2.习2】三角形面积【入门题】
  6. Python 迭代器和 C++ 迭代器,最大的不同竟然是......
  7. 结对项目编程之代码进展
  8. 当滚动页面到一定程度时,页顶菜单浮动固定在页面顶部
  9. java解析XML【转载】
  10. 利用before伪元素创建图标
  11. 关于在networkx中使用louvain算法报错的问题
  12. 17-Spring持久层框架整合
  13. 基于51单片机的教室人数检测
  14. 计算机开题报告课题来源,开题报告课题来源该怎么写
  15. 电脑桌面只显示计算机不显示文件夹,如何解决电脑桌面不显示拷贝文件的问题?...
  16. 迷你考拉仓私人小仓库储物间出租,百米内的智能仓储!
  17. 【IT运维】国内优秀的IT运维企业有哪些?
  18. 【Java】注解入门
  19. 欧拉如何解决哥尼斯堡七桥问题(二)
  20. 给通达信独立下单软件(tc.exe)加上快捷键 TCOEM.XML

热门文章

  1. mysql异步写入数据库_scrapy爬虫框架中数据库(mysql)的异步写入
  2. python的django框架从入门到熟练【保姆式教学】第一篇
  3. 【程序员面试金典】01.01. 判断字符是否唯一
  4. Python爬虫(9)selenium爬虫后数据,存入mongodb实现增删改查
  5. 关于新版微软输入法在windows11操作系统下,无法正常显示输入法中候选字词栏(candidate list)
  6. Python_itertools模块
  7. CocosCreator实战篇 | 两条线段交点
  8. Nature neuroscience:一个庞大的连接认知神经科学和人工智能的7T fMRI数据集
  9. 论文笔记Efficient two-step liver and tumour segmentation on abdominal CT
  10. 面试题,上海有多少个理发店?