用 可以做网站软件吗,wordpress前台上传,电子元器件商城官网,怎样搭建电商平台在使用socket#xff08;也就是套接字#xff09;编程的时候#xff0c;其实是工作于应用层和传输层之间
如果使用的是基于TCP的socket#xff0c;那每个数据包的发送的过程大致为#xff1a;
数据通过socket套接字构造符合TCP协议的数据包在屏蔽底层协议的情况下#…在使用socket也就是套接字编程的时候其实是工作于应用层和传输层之间
如果使用的是基于TCP的socket那每个数据包的发送的过程大致为
数据通过socket套接字构造符合TCP协议的数据包在屏蔽底层协议的情况下可以理解为TCP层直接将该数据包发往目标机器的TCP层目标机器解包得到数据
使用TCP连接收发数据需要做三件事
建立连接收发数据断开连接
下面将对这三点展开说明
建立连接TCP三次握手
在没连接的情况下客户端的TCP状态处于CLOSED状态服务端的TCP处于CLOSED未开启监听或LISTEN开启监听状态。
TCP中服务端与客户端建立连接的过程如下
客户端主动发起连接在socket编程中则为调用connect函数向服务端发送一个SYN包。这个SYN包可以看作是一个小数据包不过其中没有任何实际数据仅有诸如TCP首部等协议包必须数据。此时客户端状态从CLOSED变为SYN_SENT服务端收到SYN包并且服务端返回一个针对该SYN包的响应包ACK包和一个新的SYN包。在socket编程中服务端能收到SYN包的前提是服务端已经调用过listen函数使其处于监听状态必须处于LISTEN状态并且处于调用accept函数后等待连接的阻塞状态。此时服务端状态从LISTEN变为SYN_RCVD客户端收到服务端发来的两个包并针对新SYN包返回ACK包。此时客户端状态从SYN_SENT切换至ESTABLISHED该状态表示可以传输数据了。服务端收到ACK包成功建立连接accept函数返回客户端套接字。此时服务端状态从SYN_RCVD切换至ESTABLISHED 收发数据
当连接建立之后就可以通过客户端套接字进行收发数据了。 断开连接TCP四次挥手
双方中有一方假设为A为主动方另一方为B主动关闭连接调用close或者其进程本身被终止等情况则A向B发送FIN包A从ESTABLISHED状态切换为FIN_WAIT_1状态B接收到FIN包并发送ACK包B从ESTABLISHED状态切换为CLOSE_WAIT状态A接收到ACK包此时A从FIN_WAIT_1状态切换为FIN_WAIT_2状态一段时间后B调用自身的close函数并发送FIN包B从CLOSE_WAIT状态切换为LAST_ACK状态A接收到FIN包并发送ACK包A从FIN_WAIT_2状态切换为TIME_WAIT状态B接收到ACK包关闭连接。此时B从LAST_ACK状态切换为CLOSED状态A等待一段时间两倍的最长生命周期后关闭连接。此时A从TIME_WAIT状态切换为CLOSED状态 listen函数
#include sys/socket.h
int listen(int sockfd, int backlog);现在的backlog仅指Accept队列的最大长度。另一个队列SYN队列的最大长度由系统的其它变量决定 客户端发送的SYN到达服务器之后服务端返回SYN/ACK并将该客户端放置SYN队列中第一次第二次握手 当服务端接收到客户端的ACK之后第三次握手完成握手服务端将对应的连接从SYN队列中取出放入Accept队列等待accept函数接收并处理其请求 accept函数 accept函数由TCP服务器调用用于从Accept队列中pop出一个已完成的连接。 若Accept队列为空则accept函数所在的进程阻塞。 服务器优化Tip 如果服务器端在每接收到一个请求时都将日志在屏幕上打印例如std::cout这种与输出设备交互的IO很慢。
可以尝试将日志打印转为文件输出。