socket函数解析
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函数解析相关推荐
- C语言socket()函数解析(创建套接字)af地址族,ip地址类型(Address Family)INET(Inetnet)PF(Protocol Family)
文章目录 Linux 下的 socket() 函数 1) af 为地址族(Address Family),也就是 IP 地址类型 2) type 为数据传输方式/套接字类型 3) protocol 表 ...
- C++ socket函数解析
socket()函数 intsocket(int domain, int type, int protocol); socket函数对应于普通文件的打开操作.普通文件的打开操作返回一个文件描述字,而s ...
- 【Socket网络编程】12. send()、recv()、sendto() 和 recvfrom() 函数解析
send().recv().sendto()和recvfrom()函数解析 一般情况下,send().recv()在TCP协议下使用,sendto().recvfrom()在UDP协议下使用,也可以在 ...
- socket的accept函数解析以及服务器和多个客户端的端口问题
今天与同学争执一个话题:由于socket的accept函数在有客户端连接的时候产生了新的socket用于服务该客户端,那么,这个新的socket到底有没有占用一个新的端口? 讨论完后,才发现,自 ...
- socket通信函数解析
目录 1.socket 2.bind 3.listen 4.connect 5.send 6.recv 7.select 8.setsockopt 9.closesocket 10.总结辨析 10.1 ...
- Socket函数说明
第六章 Socket函数说明 6.1 库函数综述 6.1.1 套接字函数 表6.1 Windows Sockets 1.1版本的Berkeley Sockets函数 accept() 确认外来 ...
- linux网络编程函数解析之——setsockopt / getsockopt用法
linux网络编程函数解析之--setsockopt / getsockopt用法 工程中无线传输方面的东西用到了setsockopt(),getsockopt().网上相关博客很多,而且类似,原文出 ...
- oracle rpad mysql_Oracle生成不重复票号与LPAD,RPAD与NEXTVAL函数解析
SELECT TO_CHAR(SYSDATE,'YYMMDD')||LPAD(REFUNDSEQ.NEXTVAL,6,'0') AS RES_ORDER_NO FROM DUAL 该语句拼接 时间 与 ...
- json数据解析_VBA 实践指南 -- Split函数解析Json数据
什么是JSON? JSON(JavaScript Object Notation) 是一种及其轻量级的数据交换格式,它是 ECMAScript (欧洲计算机协会制定的JavaScript规范)的一个子 ...
最新文章
- Java Spring Boot VS .NetCore (七) 配置文件
- mysql 保留两位小数
- java基础—IO流概述
- 量子计算机西南交大,交大量子光电实验室
- P5708 【深基2.习2】三角形面积【入门题】
- Python 迭代器和 C++ 迭代器,最大的不同竟然是......
- 结对项目编程之代码进展
- 当滚动页面到一定程度时,页顶菜单浮动固定在页面顶部
- java解析XML【转载】
- 利用before伪元素创建图标
- 关于在networkx中使用louvain算法报错的问题
- 17-Spring持久层框架整合
- 基于51单片机的教室人数检测
- 计算机开题报告课题来源,开题报告课题来源该怎么写
- 电脑桌面只显示计算机不显示文件夹,如何解决电脑桌面不显示拷贝文件的问题?...
- 迷你考拉仓私人小仓库储物间出租,百米内的智能仓储!
- 【IT运维】国内优秀的IT运维企业有哪些?
- 【Java】注解入门
- 欧拉如何解决哥尼斯堡七桥问题(二)
- 给通达信独立下单软件(tc.exe)加上快捷键 TCOEM.XML
热门文章
- mysql异步写入数据库_scrapy爬虫框架中数据库(mysql)的异步写入
- python的django框架从入门到熟练【保姆式教学】第一篇
- 【程序员面试金典】01.01. 判断字符是否唯一
- Python爬虫(9)selenium爬虫后数据,存入mongodb实现增删改查
- 关于新版微软输入法在windows11操作系统下,无法正常显示输入法中候选字词栏(candidate list)
- Python_itertools模块
- CocosCreator实战篇 | 两条线段交点
- Nature neuroscience:一个庞大的连接认知神经科学和人工智能的7T fMRI数据集
- 论文笔记Efficient two-step liver and tumour segmentation on abdominal CT
- 面试题,上海有多少个理发店?