SOCKET函数详解

article/2025/10/7 19:38:54

socket原理

1.socket
socket位于应用层和TCP/IP协议通信中间,抽象成一组接口
在这里插入图片描述
1.服务端首先初始化Socket(),然后和接口进行绑定bind()和监听listen(),然后调用accept()进行阻塞。
2.客户端初始化socket(),然后调用connect()与服务端进行连接,然后客户端负责发送请求,服务端接收并且处理请求。write(),read().

2.socket的基本操作
1.socket()函数

int socket(int domain, int type, int protocol)

socket用于创建一个socket描述符,它唯一标识一个socket,包含了三个参数:
1.domain:协议域,常见的协议组用AF_INET AF_INET6 AF_LOCAL AF_ROUTE . 协议族决定了socket的地址类型,在通信中必须采用相应的地址.

2.type: 指定socket的类型.
ps:socket的类型
根据数据的传输模式,可以将internet套接字分成两种模式.
流格式套接字(SOCK_STREAM):也称之为面向连接的套接字,是一种可靠的、双向的通信数据流.它的数据可以准确无误的到达另一台里算计,如果损坏或者丢失会重新发送.(使用TCP协议)
特点:
1.数据在传输过程中不会消失
2.数据按照顺序传输
3.数据的发送和接受不是同步的(流合适套接字内部用一个缓冲区)

数据报格式套接字(SOCK_DGRAM):也称之为无连接的套接字,计算机只负责传输数据,不进行数据校验.(使用UDP协议)
特点:
1.强调快速传输而非传输顺序
2.传输的数据可能丢失可能损毁
3,限制每一次传输的大小
4.数据的发送和接受是同步的

3.protocol:协议,常见的协议有IPPROTO_TCP、IPPTOTO_UDP、 IPPROTO_SCTP、IPPROTO_TIPC他们分别对应这TCP传输协议,UDP传输协议,STCP传输协议,TIPC传输协议.当protocol为0时,会自动选择type类型对应的默认协议.

2.bind()函数

int bind (int sockfd, const struct sockaddr * addr, socklen_t addrlen);

1.sockfd:即为socket描述字,他是通过socket()函数创建的,唯一标识一个socket.bind函数就是将这个描述子绑定一个名字

2.addr:一个const struct sockaddr*指针,根据创建地质结构根据地址创建socket时的地址协议不同而不同.

3.addrlen:对应地址的长度.通常服务器在启动时会绑定一个总所周知的地址(ip地址+端口号),客户端不用指定系统自动分配,所以通常服务端在listen之前要调用bind(),而客户端不会调用,在connect()时由系统随机生成一个.

网络字节序和主机字节序:

主机字节序:
1)大端存储:低位字节放在内存的高地址端,高位字节放在内存的低地址端
2)小端存储:低位字节放在内存的低地址端,高位字节放在内存的高地址端

网络字节序:
UDP/TCP/IP协议规定:把接收到的第一个字节当作高位字节看待,这就要求发送端发送的第一个字节是高位字节;而在发送端发送数据时,发送的第一个字节是该数值在内存中的起始地址处对应的那个字节,也就是说,该数值在内存中的起始地址处对应的那个字节就是要发送的第一个高位字节(即:高位字节存放在低地址处);由此可见,多字节数值在发送之前,在内存中因该是以大端法存放的

将地址绑定到一个socket时,需要将主机字节序转换为网络字节序。

3.listen()函数、connect()函数

int listen(int sockfd, int backlog)

listen函数的第一个参数时即将要监听的socket描述字,第二个参数为相应的socket可以排队的最大连接数。socket()创建的socket默认是一个主动类型,listen则将socket变成被动类型,等待客户连接请求。

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen)

connect函数的第一个参数是客户端socket的描述子,第二个参数是socket的地址,第三个函数是socket的地址的长度。客户端通过调用connect函数建立与TCP服务器的连接。

4.accept()函数

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

accept函数的第一个函数为服务器端的socket描述字,是服务器一开始调动socket()函数产生的,而accept函数返回的是已经连接的socket描述字。第二个参数用于返回客户端的协议地址,第三个表示地址的长度。

5.read(),write()等I/O读写函数

6.close()函数

int close(int fd)

close函数将对应的socket描述字的引用计数-1,当引用计数为0时,触发TCP客户端向服务器端发送终止连接请求。

7.TCP三次握手连接

1.客户端向服务器发送一个SYN 1
2.服务器向客户端发送一个SYN 2 ,并且对SYN 1 进行确认,ACK 1 + 1;
3.客户端向服务器确认 ACK 2 + 1

8.TCP四次挥手

1.客户端调用close主动关闭连接,向服务器端发送一个FIN 3

2.服务器端接受后,执行被动关闭,同时对FIN进行确认,ACK 3 +1 。同时它也作为文件结束符传递给应用程序。

3.一段时间后,接受到文件结束符的应用程序调用close关闭它的socket。同时服务器也发送一个FIN N。

4.接受到FIN的进行对服务器进行确认服务器端进行确认。

/-----------------/

FIN_WAIT1 / --------------/

/-----------------/

                                                  CLOSE_WAIT

FIN_WAIT2

		                               -----------------------

                                              LAST_ACK	 /-----------------------CLOSE 

TIME_WAIT


http://chatgpt.dhexx.cn/article/TsQS0135.shtml

相关文章

用大白话解释什么是Socket

好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star,更多文章请前往:目录导航 前言 我在去年就学习过Java中Socket的使用,但对于Socket的理解一直都是迷迷糊糊…

Socket详解

“一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket。 ——有感于实际编程和开源项目研究。 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时&#xff…

Java socket详解

整理和总结了一下经常遇到的问题: 1. 客户端socket发送消息后,为什么服务端socket没有收到? 2. 使用while 循环实现连续输入,是不是就是多线程模式? 3. 对多线程处理机制不是很明白,希望详细讲解…

Socket的详细介绍

文章目录 前言1-Socket出现的原因1.1-Socket出现的背景1.2-Socket解决的问题 2-Socket的组成及关键点2.1-What:什么是Socket?2.2-How: Socket通信实现的步骤2.3-How: Socket编写流程 3-Socket的关键实现3.1-socket()函数创建套接字…

Socket到底是什么?

学习java网络编程一段时间后,突然被问到socket是什么?回答不上来,感觉很尴尬,于是赶紧是查阅资料。 网络由下往上分为 物理层 、数据链路层 、 网络层 、 传输层 、 会话层 、 表现层 和 应用层。 通过初步了解,我知道…

什么是Socket?

一、什么是Socket? 在计算机通信领域,socket 被翻译为“套接字”(套接字主机端口号),它是计算机之间进行通信的一种约定或一种方式。通过 socket这种约定,一台计算机可以接收其他计算机的数据,也…

Socket的学习(一)什么是Socket?

本文参考的是《Socket通信原理》https://www.cnblogs.com/wangcq/p/3520400.html 一、TCP/IP UDP是什么? TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集&#xff0c…

整数划分(递归方法)

最近讲到了递归,老师布置了一道经典的整数划分问题,浏览了网上很多代码,还是似懂非懂,想找张清晰地展现递归过程的图片也没有,今天想了想,自己画了一张才发现,想完整清晰地表现这个过程确实真的…

递归算法--整数划分

何为整数划分: 所谓整数划分,是指把一个正整数n写成为 其中, 为正整数,并且 ; 为n的一个划分。 如果 中的最大值不超过m,即 ,则称它属于n的一个m划分。 例如:6的划分: 6…

递归实现整数划分

递归思想 递归是算法设计中的一种基本而重要的算法。递归方法通过函数调用自身将问题转化为本质相同但规模较小的子问题,是分治策略的具体体现。 不多废话,直接上故事 ->从前有座山,山上有座庙,庙里有个老和尚在给小和尚讲故…

复杂的整数划分

复杂的整数划分 又到了动态规划的时间了! 记得我之前讲过的三要素哦 下面这一条题目其实思路并不是非常的难,但是在细节处理上要非常仔细,而且它有3个相互独立的动态规划问题。 总时间限制: 200ms 内存限制: 65536kB 描述 将正整数n 表…

整数划分(DP)

一个正整数 n 可以表示成若干个正整数之和,形如:nn1n2…nk,其中 n1≥n2≥…≥nk,k≥1。 我们将这样的一种表示称为正整数 n 的一种划分。 现在给定一个正整数 n,请你求出 n 共有多少种不同的划分方法。 输入格式 共一行&#x…

【算法】整数划分问题

描述 整数划分问题是算法中的一个经典命题之一。把一个正整数n表示成一系列正整数之和: 正整数n的这种表示称为正整数n的划分。正整数n的不同划分个数称为正整数n的划分数,记作P(n) 。 正整数6有如下11种不同的划分,所以P(6)11。 6 51 42, …

【递归】整数划分(C++)

一、什么是整数划分 所谓整数划分,是指把一个正整数n写成如下形式: n m 1 m 2 ⋅ ⋅ ⋅ m i nm_1m_2m_i nm1​m2​⋅⋅⋅mi​; 其中 m i m_i mi​为正整数,并且 1 ≤ m i ≤ n 1 \leq m_i \leq n 1≤mi​≤n,则 { …

整数划分问题的递归解决(详解)

整数划分问题 这个问题在网上其实有好多博客、文章,本人认为讲的都稍有粗略,这篇文章是个人写的认为稍微详细一点的!! 将正整数n表示为一系列正整数之和, nn1n2n3n4......nk (其中,n1>n2&…

整数划分算法

整数划分问题 问题阐述 将正整数n表示成一系列正整数之和:nn1n2…nk, 其中n1≥n2≥…≥nk≥1,k≥1。 正整数n的这种表示称为正整数n的划分。 输入:一个正整数n 输出:n不同划分个数以及n的划分结果。 问题实例 …

整数划分总结

博客原地址:https://blog.csdn.net/dacc123/article/details/50664738 整数划分问题: 笼统上说就是将一个整数划分成若干个整数之和的方案数。整数划分有很多不同的问法,也有比较隐晦的问法。比如n个苹果放到m个盘子里,比如n个砖块…

整数划分问题(分治算法经典)

题目描述: 整数划分问题是将一个正整数n拆成一组数连加并等于n的形式,且这组数中的最大加数不大于n。 即:nn1n2…nk; n1>n2>n3…>nk 如整数的6划分为: 6 5 1 4 2, 4 1 1 3 3, 3 2 1, 3 1 1 1 2 2 2, 2 2 1 1, 2 1 …

数据源:SHP数据下载平台

1. 地理信息专业知识服务系统 中国工程院 中国工程科技知识中心 2. 国家基础地理信息中心 自然资源部 国家基础地理信息中心 3. 天地图API 自然资源部 国家基础地理信息中心 4. 中国科技资源共享网 科技部 国家科技资源共享服务工程技术研究中心 5. 地球大数据科学工…

使用ARCGIS对shp数据添加投影坐标系

系统工具箱→data management tool→投影和变换→定义投影 输入需要添加投影的shp 选择需要的投影坐标系