2-5:套接字(Socket)编程之从内核角度深入理解套接字
文章目录
以TCP通信为例,创建套接字时使用的接口是socket
,监听使用的listen
,绑定使用的bind
,不管怎样,他们都是系统调用接口。在Linux内核代码中,是通过call来区分的
其实,创建套接字的时候,在底层会首先创建一个内核结构,叫做struct socket
其中有两个非常重要的struct,分别是file
和sock
。file
与文件有关,因为socket本质就是文件,而这是套接字,一定还要与网络相关,因此其内部还会有一个结构体是sock
如下是sock结构体
当然这里不止这么一种sock
,还有很多种sock
,例如tcp_sock
,udp_sock
,raw_sock
在sock中有两个结构体:
struct sk_buff_head sk_receive_queue;//接受的数据放入接受队列
struct sk_buff_head sk_write_queue;//用户层写入的数据放入该队列
当然如果你使用的是tcp,那么使用的sock就是tcp_sock
如果你使用的是udp,那么使用的sock就是udp_sock
大家可以看到无论是udp_sock
还是tcp_sock
,都必须保证“inet_sock has to be the first member ”
同时inet_sock
里的第一个字段正是sock
整个过程实际有点绕,但是总结到下面这张图中就十分清晰了
结合前面说过的task_struct
,访问时只要强转,也就是进行切片操作就可以完成任意结构体的访问了
在创建套接字时,会调用sock_map_fd
,创建一个文件,然后分配文件描述符
然后再用sock_attach_fd
,让文件和套接字产生关联
也就是下面这样
文件与套接字关系如下
2-5:套接字(Socket)编程之从内核角度深入理解套接字相关推荐
- Java套接字Socket编程--TCP参数
在Java的Socket中,主要包含了以下可设置的TCP参数. 属性 说明 默认值 SO_TIMEOUT 对ServerSocket来说表示等待连接的最长空等待时间; 对Socket来说表示读数据最长 ...
- 套接字Socket编程
Socket,原意插座.插口.写软件程序时,可以想象成一根网线,一头插在客户端,一头插在服务端,然后进行通信.所以通信前,双方都要建立一个Socket. Socket编程进行的是端到端的通信,意识不到 ...
- socket编程accept函数返回值的理解
accept函数返回值成功时返回非负值,失败时返回-1 accept函数接受一个客户端请求后会返回一个新的SOCKFD值,当有不同的客户端同时有不同请求时,会返回不同的SOCKFD的值.这个不同的值和 ...
- python 图形化socket编程_Python黑帽编程2.8 套接字编程
Python黑帽编程2.8 套接字编程 套接字编程在本系列教程中地位并不是很突出,但是我们观察网络应用,绝大多数都是基于Socket来做的,哪怕是绝大多数的木马程序也是如此.官方关于socket编程的 ...
- Socket编程(C语言实现)——UDP协议(进程间通信AF_UNIX)的流式(SOCK_STREAM)+报式(SOCK_DGRAM)传输【循环监听】
Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...
- Socket编程(C语言实现)——TCP协议(网络间通信AF_INET)的流式(SOCK_STREAM)+报式(SOCK_DGRAM)传输【多线程+循环监听】
Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...
- (转)网络编程:Socket编程从IPv4转向IPv6支持
目前运行主流的IT系统中,用于解决分布式系统内部模块及不同的系统间通信的一种主要的解决方案就是使用套接字Socket来开发应用.由于当前大部分正在运行的IT系统中使用套接字Socket开发环境基本上都 ...
- Python Socket 编程详细介绍
Python 提供了两个基本的 socket 模块: Socket 它提供了标准的BSD Socket API. SocketServer 它提供了服务器重心,可以简化网络服务器的开发. 下面讲解下 ...
- C语言 socket编程实例
C语言 socket编程实例 一. 面向连接的流式套接字 C/S 例子 二. 非阻塞的多人聊天服务器端例子 三. 简单的 IPv6 UDP socket编程 四.使用wireshark抓包分析tcp协 ...
最新文章
- QT:(3)在VS2015下配置qt
- mft按钮设计_奥林巴斯M4/3系统新品激情再燃 以轻量化设计铸就微单极致体验
- PHP与SQL数据库交互中文乱码怎么办
- 【自动驾驶】23.相机成像究竟是成在像平面还是成在焦平面
- C++Addition rule of probabilities概率加法法则算法(附完整源码)
- Juicer 中文文档
- 人口预测和阻尼-增长模型_使用分类模型预测利率-第3部分
- 18、数据的备份和还原
- Java JUC工具类--CountDownLatch
- sqlserver约束
- IDEA webapp文件夹没有蓝色小圆点的解决方案
- VScode 同时开多个窗口
- Hibernate持久化对象状态
- JS 在 HTML 中做加减乘除
- STM32——串口通信原理
- Wi-Fi:802.11ac new feature Beamforming
- PEP 635 – Structural Pattern Matching: Motivation and Rationale
- JVM?干就完了!(一) - hello world
- 常用的页面布局(两栏布局、三栏(圣杯、双飞翼)布局)
- revit常用土建软件【桩转化】功能,CAD识别转化
热门文章
- mysql found row_mysql found_row()使用详解
- 先天性异常或智力残疾儿童患者的外显子组和基因组测序:美国医学遗传学与基因组学学院循证临床指南...
- 一个函数统一238个机器学习R包,这也太赞了吧
- 给来英国的女士或先生一点建议,同样关于行李.
- java 32位_Java知识点:创建节约内存的JavaBean
- 量子通信入门相关书籍
- 4.2 算法之数论 9274 beeline(python)
- 白鹭引擎生成自定义整数随机数
- PHP批量查询数据库下载远程文件脚本实例
- 微信小程序 自动解决分包大小问题_微信小程序分包加载设置