哪个大学的网站做的最好看网页制作实训总结800字

张小明 2025/12/29 5:16:57
哪个大学的网站做的最好看,网页制作实训总结800字,简单的网页设计作品,微信h5TCP网络编程 一、前言 在网络通信协议中#xff0c;TCP#xff08;传输控制协议#xff09;以其可靠、面向连接、流式传输的特性#xff0c;成为文件传输、网页浏览、即时通信等场景的核心协议。与UDP的无连接不可靠传输不同#xff0c;TCP通过一系列机制保障了数据传输…TCP网络编程一、前言在网络通信协议中TCP传输控制协议以其可靠、面向连接、流式传输的特性成为文件传输、网页浏览、即时通信等场景的核心协议。与UDP的无连接不可靠传输不同TCP通过一系列机制保障了数据传输的完整性和有序性是互联网应用的基石。二、TCP核心理论基础2.1 常见网络架构模型网络通信主要分为三种架构模型其中TCP广泛应用于CS架构各模型特点如下架构模型英文全称核心组成应用场景核心特点CS模型Client-Server客户端-服务器专用客户端 服务器微信、QQ、游戏客户端、桌面软件1. 专用客户端功能强大2. 支持自定义协议/标准协议3. 资源可缓存至本地响应速度快4. 功能相对复杂需单独安装客户端BS模型Browser-Server浏览器-服务器通用浏览器 服务器网页浏览、在线商城、办公系统1. 通用客户端浏览器无需单独安装2. 固定使用HTTP/HTTPS应用层协议3. 资源由服务器提供本地无缓存可临时缓存4. 功能相对简单依赖浏览器环境P2P模型Peer-to-Peer对等网络多个对等节点既是客户端也是服务器迅雷、BT下载、点对点文件传输1. 无中心服务器节点地位平等2. 下载者同时也是上传者提升传输效率3. 网络扩展性强无需依赖中心节点支撑2.2 TCP核心特征TCP作为传输层可靠协议具备以下关键特征也是其与UDP的核心区别面向连接通信双方需先通过“三次握手”建立连接连接建立后才能传输数据断开连接需通过“四次挥手”完成。可靠传输通过“应答机制ACK”、“超时重传”、“流量控制”、“拥塞控制”保障数据有序、完整到达无丢包、乱序问题。流式套接字数据传输无边界以字节流形式连续传输发送方多次发送的数据可能被接收方一次性接收。全双工通信通信双方各自拥有发送缓冲区和接收缓冲区可同时进行发送和接收操作互不干扰。收发次数无需对应发送方发送2次数据如分别发送10字节、20字节接收方可一次性接收30字节无需与发送次数匹配。存在写阻塞当发送缓冲区满默认约64K时发送操作会阻塞直到缓冲区有空闲空间。连接状态感知若一方异常断开或正常关闭另一方可通过协议机制感知到连接状态变化及时终止通信。2.3 TCP关键概念解析1监听套接字与通信套接字TCP服务端存在两种套接字职责分工明确监听套接字listfd由socket()创建、bind()绑定、listen()监听仅负责等待客户端连接请求不参与实际数据传输生命周期贯穿整个服务端运行过程。通信套接字connfd由accept()函数返回专门用于与已建立连接的客户端进行数据收发一个客户端对应一个通信套接字客户端断开连接后需关闭该套接字。2黏包问题黏包是TCP流式传输的特有问题由于数据无边界发送方多次发送的小数据段可能被内核合并后一次性发送接收方无法区分数据边界导致数据解析异常。产生原因TCP为提高传输效率会采用Nagle算法合并小数据包接收方缓冲区未及时读取数据也会导致多个数据包堆积。影响无法正确拆分完整的业务数据如连续发送“用户名”和“密码”接收方可能一次性收到拼接后的字符串无法区分。3三次握手与四次挥手三次握手建立TCP连接的过程确保双方收发能力正常分配资源避免无效连接占用资源。客户端→服务端发送SYN包请求建立连接服务端→客户端发送SYNACK包确认收到客户端请求并同步自身序列号客户端→服务端发送ACK包确认收到服务端响应连接建立完成。四次挥手关闭TCP连接的过程确保双方数据传输完毕释放资源。主动关闭方→被动关闭方发送FIN包告知对方不再发送数据被动关闭方→主动关闭方发送ACK包确认收到FIN包此时被动关闭方可继续发送剩余数据被动关闭方→主动关闭方发送FIN包告知对方数据已发送完毕准备关闭主动关闭方→被动关闭方发送ACK包确认收到FIN包等待超时后关闭连接被动关闭方收到ACK后直接关闭连接。2.4 TCP核心API函数详解TCP编程依赖一系列系统调用函数核心函数的功能、参数与返回值如下函数原型功能描述适用角色关键参数说明返回值int socket(int domain, int type, int protocol);创建套接字描述符建立应用与内核网络协议栈的接口服务端/客户端domain地址族AF_INETIPv4type套接字类型SOCK_STREAMTCPprotocol协议类型0自动适配成功套接字ID失败-1int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);将套接字与本地IP端口绑定确定服务端监听地址服务端sockfd监听套接字IDmy_addr本地地址结构体addrlen地址结构体长度成功0失败-1int listen(int sockfd, int backlog);将监听套接字转为监听状态等待客户端连接服务端sockfd监听套接字IDbacklog三次握手队列长度允许等待的最大连接数成功0失败-1int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);从监听队列中取出已建立的客户端连接创建通信套接字服务端sockfd监听套接字IDaddr用于存储客户端地址信息NULL不关心addrlen客户端地址长度传入地址成功通信套接字ID失败-1int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);向服务端发起连接请求完成三次握手客户端sockfd客户端套接字IDaddr服务端地址结构体addrlen服务端地址长度成功0失败-1ssize_t recv(int sockfd, void *buf, size_t len, int flags);从套接字接收数据到本地缓冲区服务端/客户端sockfd服务端通信套接字客户端创建的套接字buf数据接收缓冲区len缓冲区大小flags接收模式0阻塞成功接收字节数失败-1对方关闭0ssize_t send(int sockfd, const void *msg, size_t len, int flags);将本地数据发送到套接字发送缓冲区服务端/客户端sockfd服务端通信套接字客户端创建的套接字msg待发送数据缓冲区len发送数据长度flags发送模式0阻塞成功发送字节数失败-1三、TCP编程流程3.1 服务端流程核心监听→连接→通信→关闭调用socket()创建监听套接字调用bzero()清空地址结构体初始化服务端IP与端口需转换为网络字节序调用bind()绑定监听套接字与本地地址调用listen()将套接字设置为监听状态调用accept()阻塞等待客户端连接成功返回通信套接字循环调用recv()接收客户端数据调用send()回复数据客户端断开连接后关闭通信套接字服务端退出时关闭监听套接字。3.2 客户端流程核心连接→通信→关闭调用socket()创建客户端套接字调用bzero()清空地址结构体初始化服务端IP与端口调用connect()向服务端发起连接请求循环调用send()发送数据调用recv()接收服务端回复通信结束后调用close()关闭客户端套接字。3.3 服务端与客户端流程对比表流程步骤服务端操作客户端操作对应函数1创建监听套接字创建客户端套接字socket()2初始化本地地址结构体初始化服务端地址结构体bzero()、htons()、inet_addr()3绑定套接字与本地地址向服务端发起连接请求bind()4设置套接字为监听状态-listen()5接受客户端连接创建通信套接字-accept()6接收客户端数据 回复数据发送数据 接收服务端回复recv()、send()7关闭通信套接字关闭客户端套接字close(connfd)8关闭监听套接字-close(listfd)四、TCP实战时间戳回显服务完整可运行代码本节实现一个简单的TCP服务端接收客户端发送的消息后拼接当前系统时间戳再回复给客户端客户端循环发送测试消息并接收回复直观展示TCP通信的完整流程。4.1 服务端代码tcp_server.c#includenetinet/in.h#includenetinet/ip.h#includestdio.h#includestdlib.h#includestring.h#includestrings.h#includesys/socket.h#includesys/types.h/* See NOTES */#includetime.h#includeunistd.h// 定义套接字地址结构体指针别名简化代码书写typedefstructsockaddr*(SA);intmain(intargc,char*argv[]){// 1. 创建TCP监听套接字SOCK_STREAM指定为流式套接字对应TCPintlistfdsocket(AF_INET,SOCK_STREAM,0);if(-1listfd){perror(socket error);// 出错打印错误信息exit(1);// 异常退出}printf(TCP监听套接字创建成功套接字ID%d\n,listfd);// 2. 初始化服务端与客户端地址结构体structsockaddr_inser,cli;bzero(ser,sizeof(ser));// 清空服务端地址结构体bzero(cli,sizeof(cli));// 清空客户端地址结构体// 配置服务端地址信息ser.sin_familyAF_INET;// 指定IPv4地址族ser.sin_addr.s_addrINADDR_ANY;// 绑定所有本地网卡IP无需指定具体IPser.sin_porthtons(50000);// 端口号转换为网络字节序50000为自定义端口// 3. 绑定监听套接字与服务端地址IP端口intretbind(listfd,(SA)ser,sizeof(ser));if(-1ret){perror(bind error);exit(1);}printf(监听套接字绑定成功监听端口50000\n);// 4. 将监听套接字设置为监听状态等待客户端连接// backlog3允许3个客户端处于三次握手等待队列listen(listfd,3);printf(服务端已进入监听状态等待客户端连接...\n);// 5. 接受客户端连接创建通信套接字阻塞等待socklen_tlensizeof(cli);// 客户端地址结构体长度intconnfdaccept(listfd,(SA)cli,len);if(-1connfd){perror(accept error);exit(1);}printf(客户端连接成功通信套接字ID%d\n,connfd);// 6. 循环接收客户端数据并回复时间戳while(1){charbuf[512]{0};// 接收缓冲区初始化// 从通信套接字接收客户端数据阻塞模式intnrecv(connfd,buf,sizeof(buf),0);if(n0){// n0表示客户端正常关闭n-1表示接收失败printf(client close or recv error\n);break;}printf(收到客户端数据%s\n,buf);// 获取当前系统时间拼接至接收数据后time_ttm;time(tm);// 获取当前时间戳structtm*infolocaltime(tm);// 转换为本地时间结构体// 格式化字符串拼接时间戳时:分:秒sprintf(buf,%s %d:%d:%d,buf,info-tm_hour,info-tm_min,info-tm_sec);// 向客户端发送拼接后的回复数据send(connfd,buf,strlen(buf),0);printf(已向客户端回复数据%s\n,buf);}// 7. 关闭套接字释放资源close(connfd);// 关闭通信套接字close(listfd);// 关闭监听套接字printf(服务端正常退出套接字已关闭\n);return0;}服务端代码关键解析INADDR_ANY绑定所有本地网卡IP无需手动指定具体IP地址适配多网卡环境listen(listfd, 3)设置监听队列长度超出队列的客户端连接会被拒绝accept(listfd, (SA)cli, len)阻塞等待客户端连接成功后将客户端地址信息存入cli结构体recv(connfd, buf, sizeof(buf), 0)通过通信套接字接收数据connfd是与客户端唯一对应的通信标识循环退出条件n0表示客户端关闭连接或接收失败此时终止通信并关闭套接字。4.2 客户端代码tcp_client.c#includestdio.h#includestdlib.h#includestring.h#includeunistd.h#includenetinet/in.h#includesys/socket.h#includesys/types.h/* See NOTES */#includenetinet/ip.h#includetime.h// 定义套接字地址结构体指针别名typedefstructsockaddr*(SA);intmain(intargc,char*argv[]){// 1. 创建TCP客户端套接字intsockfdsocket(AF_INET,SOCK_STREAM,0);if(-1sockfd){perror(socket);exit(-1);}printf(TCP客户端套接字创建成功套接字ID%d\n,sockfd);// 2. 初始化服务端地址结构体配置连接目标信息structsockaddr_inser;bzero(ser,sizeof(ser));// 清空服务端地址结构体ser.sin_familyAF_INET;// IPv4地址族ser.sin_porthtons(50000);// 服务端端口与服务端保持一致ser.sin_addr.s_addrINADDR_ANY;// 连接本地服务端可替换为具体服务端IP// 3. 向服务端发起连接请求完成三次握手intretconnect(sockfd,(SA)ser,sizeof(ser));if(-1ret){perror(connect);exit(-1);}printf(客户端与服务端连接成功开始通信...\n);// 4. 循环发送测试数据接收服务端回复循环100次inti100;while(i--){charbuf[512]this is tcp test;// 待发送的测试数据// 向服务端发送数据send(sockfd,buf,strlen(buf),0);printf(已向服务端发送数据%s剩余发送次数%d\n,buf,i);bzero(buf,sizeof(buf));// 清空缓冲区准备接收回复// 接收服务端回复数据recv(sockfd,buf,sizeof(buf),0);printf(收到服务端回复%s\n,buf);sleep(1);// 每隔1秒发送一次避免发送过快}// 5. 关闭客户端套接字释放资源close(sockfd);printf(客户端通信结束套接字已关闭\n);return0;}客户端代码关键解析connect(sockfd, (SA)ser, sizeof(ser))主动向服务端发起连接参数为服务端地址信息成功完成三次握手后建立连接ser.sin_addr.s_addr INADDR_ANY连接本地服务端自机通信若需跨机通信可替换为服务端的实际IP如inet_addr(192.168.14.128)sleep(1)控制发送速率避免频繁发送导致服务端压力过大同时便于观察通信过程。五、编译与运行步骤Ubuntu虚拟机环境5.1 环境准备确保Ubuntu系统已安装gcc编译器未安装可执行sudo apt update sudo apt install gcc -y打开两个终端终端1运行服务端终端2运行客户端确保当前目录包含tcp_server.c和tcp_client.c文件。5.2 编译代码# 编译服务端代码gcc tcp_server.c -o tcp_server# 编译客户端代码gcc tcp_client.c -o tcp_client5.3 运行程序步骤1启动服务端终端1./tcp_server服务端输出示例TCP监听套接字创建成功套接字ID3 监听套接字绑定成功监听端口50000 服务端已进入监听状态等待客户端连接... 客户端连接成功通信套接字ID4 收到客户端数据this is tcp test 已向客户端回复数据this is tcp test 16:20:30 收到客户端数据this is tcp test 已向客户端回复数据this is tcp test 16:20:31 ...步骤2启动客户端终端2./tcp_client客户端输出示例TCP客户端套接字创建成功套接字ID3 客户端与服务端连接成功开始通信... 已向服务端发送数据this is tcp test剩余发送次数99 收到服务端回复this is tcp test 16:20:30 已向服务端发送数据this is tcp test剩余发送次数98 收到服务端回复this is tcp test 16:20:31 ... 客户端通信结束套接字已关闭步骤3停止程序客户端完成100次发送后会自动退出服务端检测到客户端关闭后也会退出若需手动停止可使用CtrlC终止程序运行。六、常见问题排查6.1 bind()失败Address already in use原因服务端绑定的端口如50000已被其他进程占用解决方法使用netstat -anp | grep 50000查找占用端口的进程ID使用kill -9 进程ID终止占用进程修改代码中的端口号如改为50001重新编译运行。6.2 connect()失败Connection refused原因服务端未启动、服务端端口配置错误、服务端监听地址与客户端连接地址不匹配解决方法先启动服务端再启动客户端确保客户端与服务端的端口号一致若跨机通信客户端需填写服务端的实际IP而非INADDR_ANY。6.3 黏包问题出现现象客户端多次发送的“this is tcp test”被服务端一次性接收出现数据拼接临时解决方法发送方每次发送后添加sleep()避免内核合并数据包接收方每次接收后及时处理数据清空缓冲区长期解决方案在应用层添加数据边界标识如固定长度、分隔符、数据头数据体格式。6.4 服务端只能处理一个客户端连接原因示例代码为单客户端模型accept()仅接受一个客户端连接后续客户端会被拒绝解决方法使用多线程/多进程每接受一个客户端连接就创建一个线程/进程处理通信实现多客户端并发处理。七、总结与扩展7.1 本文总结TCP核心特性面向连接、可靠传输、流式套接字、全双工通信通过三次握手和四次挥手管理连接生命周期关键概念监听套接字负责监听与通信套接字负责通信分工明确黏包问题是TCP流式传输的固有问题编程流程服务端创建→绑定→监听→接受→通信→关闭客户端创建→连接→通信→关闭实战验证时间戳回显服务实现了TCP的基本通信验证了数据的可靠收发与连接管理。7.2 扩展方向多客户端并发处理使用pthread多线程或fork多进程让服务端同时处理多个客户端连接黏包问题彻底解决在应用层设计数据格式如“数据长度数据内容”实现数据的正确拆分非阻塞IO与多路复用使用fcntl设置非阻塞套接字结合select/poll/epoll实现高并发服务端TCP协议进阶深入学习TCP的流量控制、拥塞控制、滑动窗口机制理解可靠传输的底层原理实际应用开发基于TCP实现文件传输、即时聊天、HTTP服务器等实用应用提升工程实践能力。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

做网站怎么租个域名小蝌蚪紧急自动跳转中

本文重点 在前面课程中,我们学习了协方差,本文我们学习协方差矩阵。如果理解协方差,那么协方差矩阵就不是问题了。 协方差矩阵 对于n维随机向量x,其任意两个分量xi和xj之间的协方差cov(xi,xj)组成的矩阵称为协方差矩阵。 下面以二维随机向量x=[x1,x2]为例,看一下协方差…

张小明 2025/12/29 5:15:50 网站建设

58同城盐城网站建设深圳做网站排名哪家专业

Windows 系统性能数据记录与分析全解析 1. 不同格式日志文件的性能对比 在性能数据记录过程中,文件格式的选择对文件大小和 CPU 消耗有着显著影响。以二进制日志文件为例,在特定的收集间隔下,其大小增长到了超过 92.5 MB,每个收集间隔超过 2 MB。在收集性能数据并写入该二…

张小明 2025/12/29 5:15:17 网站建设

做网站审批号必须要怎么看一个网站是什么时候做的

MMDetection简介 Python的MMDetection(简称mmdet)是一款基于PyTorch的开源目标检测工具库,专注于AI目标检测模型的训练与推理任务,为开发者提供了丰富的算法支持和便捷的使用接口。 MMDetection的使用指南 安装mmdet 1.安装CUDA&a…

张小明 2025/12/29 5:14:10 网站建设

猪八戒做网站南京网站设计培训价格

视频演示 基于深度学习的肾结石检测系统演示 1. 前言​ 大家好,欢迎来到「Coding茶水间」! 在日常医学影像工作中,肾结石的筛查往往需要医生仔细阅片,不仅耗时,还容易受到主观因素影响。为了让这一过程更高效、更客观&…

张小明 2025/12/29 5:13:36 网站建设