Socket(套接字)网络编程
socket函数,就是一个”造门“的工具,这扇门,是连接电脑程序的门,通过这扇门,你的程序就能通过这扇门,和其他电脑上的程序说话了。
socket工作于TCP/IP协议栈之上
它应用在浏览器,手机应用,用于服务器管理的SSH客户端
通过socket实现不同主机之间的通信,我们需要指定主机之间的IP地址和一个端口号
IP地址用于唯一标识独立的网络设备,端口号用于区分主机上需要发送数据的不同应用
通过socket,我们可以连接不同主机,不同应用之间的一条虚拟通道,这条虚拟通道点对点
TCP协议是可靠的,它的底层会自动检测并回传丢失的数据包,对于调用者来说,你发送的数据对方一定会接收到,其次,发送和接收到的数据顺序是一致的,比如你发送了一串字符,对方就会原封不动的接收到相同发送的字符,这也就是大家说TCP是基于数据流的协议
UDP
UDP不会自动回传数据包,因此不保证数据一定被对方接收到,正是因为缺少这些检查,UDP通常具有更低的延迟并占用更少的系统资源
一.socket()函数接口
如何造这扇门
1.门要开在哪里?(domain域)
比如,你想要用IPV4网络(就是大多数家庭宽带用的那种),那就告诉socket():“我要开在IPV4的世界”
2.这扇门是那种类型的?(type)
门有各种各样的,有的门需要对方敲门你才能开(就像TCP,要连接上了才能开),有的门则是谁都能开(就像UDP,不用连接就能发消息)
3.门的后面是什么(Protocol协议)
这个通常用默认的就好了,比如IPV4+TCP协议
4.造门成功
会返回一个门牌号(套接字描述符),这个门牌号是个数字,之后就用它来指挥这扇门,比如开门(连接服务器),关门(关闭连接),或者通过门发送东西(发送数据)
5.关门
聊完天,记得关门,不然门就会一直开着,会浪费资源。就像你家里出门要关门一样,程序里也要用close把门关上
二.accept()函数
为什么要了解accept函数,在网络编程中,accept()函数是服务端应用接收客户端连接请求的关键函数。它的性能,使用方法以及错误处理方式直接影响到服务器的响应速度和系统稳定性。无论是传统的Web服务器,还是现代的高并发服务,理解并合理运用accept()函数对提升应用性能至关重要。
accept()函数的主要作用是接收客户端的连接请求,并返回一个新的套接字描述符,客户端的连接会经过服务器的监听listen()接口,等待被服务器端的accept()函数接受。 简而言之,accept()函数实现了客户端与服务端之间的"握手",为后续通信提供了基础。
在多客户端并发的环境下,accept()函数负责从连接队列中提取等待连接的客户端并为其分配新的套接字描述符,用于客户端和服务端的数据交换
第二个参数sockaddr,accept函数会填充这个结构体,包含客户端的网络地址信息,如IP地址和端口号
第三个参数输入时指定客户地址结构体大小,输出时获取客户端地址的实际长度
失败返回-1.成功返回新的套接字描述符
整个通信过程分为服务端和客户端
服务端创建套接字,返回描述符,然后开始绑定端口号,启动监听,启动阻塞等待客户端连接返回新的套接字,
客户端连接请求,服务器完成TCP三次握手接收并处理通过accept()返回新的描述符,监听套接字继续接收其他连接
客户端与新套接字直接通信,通过send/recv传输数据,监听套接字不受影响,通信关闭,客户端close,服务器端关闭通信套接字,监听套接字保持活动状态
服务器端的流程
客户端的流程