当前位置: 首页 > news >正文

网络编程---TCP

1.TCP:传输控制协议,位于传输层

2.TCP的特性:

a.使用流式套接字,数据连续,有顺序

b.TCP是可靠传输,有有应答机制ACK,即收到数据后会明确告知发送方已收到数据;若发送方没有在预计时间收到应答,则会自动重传刚刚的数据

c.TCP在建立连接后传输链路会一直存在

d.TCP为全双工通信,在同一时刻既可以收也可以发

e.为满足同时收发,TCP存在双缓冲区,每个大小为64k,当缓冲区满时,会发生相应阻塞

3.TCP的收发过程:

三次握手过程

1.客户端向服务端发送SYN连接请求信号和随机初始序列号 (Client ISN)

2.服务端向客户端发送ACK确认信号和SYN连接请求信号,并发送自己的随机初始序列号 (Server ISN)

3.客户端向服务端发送ACK确认信号

四次挥手过程

a.客户端向服务端发送FIN结束连接请求信号,和SYN连接请求信号

b.服务端向客户端发送ACK确认信号

c.服务端向客户端发送FIN结束连接请求信号和ACK确认信号

d.客户端向服务端发送ACK确认信号,连接结束

4.TCP函数的调用顺序

1)TCP服务端

a.socket()产生一个监听套接字

b.bind()绑定源地址

c.listen()监听

d.accept()建立连接,产生通信套接字,即三次握手过程

e.read(),write()

f.close()关闭监听套接字

2)TCP客户端

a.socket()产生一个套接字

b.accept()建立连接,产生通信套接字,即三次握手过程

c.read(),write()

d.close()关闭套接字

5.使用TCP从客户端向服务端发送一个照片文件

ser端

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <time.h>
#include <netinet/in.h>
#include <arpa/inet.h>
typedef struct sockaddr *(SA);
int	main(int argc, char **argv)
{int fd=open("2.jpg", O_WRONLY|O_CREAT|O_TRUNC,0666);int listfd=socket(AF_INET,SOCK_STREAM,0);if(-1==listfd){perror("socket fail\n");return 1;}struct sockaddr_in ser,cil;bzero(&ser, sizeof(ser));bzero(&cil, sizeof(cil));socklen_t len=sizeof(cil);ser.sin_family=AF_INET;ser.sin_port=htons(50000);//127.0.0.1表示自己的ip地址,本机自己收发//ser.sin_addr.s_addr=inet_addr("127.0.0.1");ser.sin_addr.s_addr=INADDR_ANY;int ret=bind(listfd, (SA)&ser, sizeof(ser));if(-1==ret){perror("blind");return 1;}listen(listfd, 3);//三次握手的排队数int conn=accept(listfd, (SA)&cil, &len);//conn为通信套接字if(conn==-1){perror("accept");return 1;}while(1){char buf[1024]={0};//int ret=recv(conn, buf, sizeof(buf), 0);int ret=recvfrom(conn, buf, sizeof(buf), 0,(SA)&cil,&len);if(ret<=0)//==0说明对方连接断开{break;}write(fd, buf, ret);bzero(buf, sizeof(buf));strcpy(buf,"ok");send(conn, buf, strlen(buf), 0);}close(listfd);close(conn);return 0;
}

cli端

#include <string.h>
#include <strings.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <time.h>
#include <fcntl.h>
typedef struct sockaddr *(SA);
int	main(int argc, char **argv)
{int fd=open("1.jpg", O_RDONLY);if(-1==fd){perror("open");return 1;}int conn=socket(AF_INET, SOCK_STREAM, 0);if(-1==conn){perror("socket");return 1;}struct sockaddr_in ser;bzero(&ser,sizeof(ser));ser.sin_family=AF_INET;ser.sin_port=htons(50000);ser.sin_addr.s_addr=INADDR_ANY;int ret=connect(conn, (SA)&ser, sizeof(ser));if(-1==ret){perror("connect error\n");return 1;}while (1){char buf[1024]={0};int ret=read(fd, buf, sizeof(buf));if(ret<=0){break;}send(conn, buf, ret, 0);bzero(buf, sizeof(buf));recv(conn, buf, sizeof(buf), 0);}close(conn);close(fd);return 0;
}

6.数据的粘包

发送方发送数据,接收方无法解析数据

解决方案:

a.设置边界

b.固定大小

c.自定义协议


文章转载自:

http://q8NFREFN.npbnc.cn
http://eioXcHXv.npbnc.cn
http://RI9O0LuZ.npbnc.cn
http://41F06Vvj.npbnc.cn
http://IKfNG6LT.npbnc.cn
http://M4gbi665.npbnc.cn
http://mpgXkuM8.npbnc.cn
http://PY57IcmM.npbnc.cn
http://qfRlKzMb.npbnc.cn
http://HsJlrk7K.npbnc.cn
http://c1ANiqta.npbnc.cn
http://WUiknsdG.npbnc.cn
http://24UCO98b.npbnc.cn
http://BJoj7EOt.npbnc.cn
http://5ErwgQvW.npbnc.cn
http://nWzff9Ny.npbnc.cn
http://9YRQpsqu.npbnc.cn
http://JdxvDOf6.npbnc.cn
http://xe558ef4.npbnc.cn
http://LhL1tiDu.npbnc.cn
http://QYC8YeIo.npbnc.cn
http://hutEPKFP.npbnc.cn
http://6J7XVX6r.npbnc.cn
http://L7N1BDsF.npbnc.cn
http://kJB7TwGK.npbnc.cn
http://gabGgb42.npbnc.cn
http://6pPTDpSY.npbnc.cn
http://ALrBEdrJ.npbnc.cn
http://wxwlAcR0.npbnc.cn
http://DDjoANyd.npbnc.cn
http://www.dtcms.com/a/374616.html

相关文章:

  • Tomcat商业部署调优(待完成)
  • GitHub SSH 连接超时解决方法 | 网络屏蔽了 GitHub 的 SSH 端口(22)
  • PyTorch自定义模型结构详解:从基础到高级实践
  • PythonSpark综合案例
  • 【Leetcode】高频SQL基础题--626.换座位
  • 字符串-14.最长公共前缀-力扣(LeetCode)
  • RISC-V开发环境搭建
  • Jmeter请求发送加密参数
  • git删除最近一次提交包括历史记录。
  • jmeter 带函数压测脚本
  • jmeter实现两个接口的同时并发
  • 在git仓库的空文件夹中添加.gitkeep文件
  • Vue3+Node.js 实现大文件上传:断点续传、秒传、分片上传完整教程(含源码)
  • 大数据毕业设计选题推荐-基于大数据的国内旅游景点游客数据分析系统-Spark-Hadoop-Bigdata
  • Shell 脚本基础、组成结构、调试与运算符
  • Axum web框架【实习】
  • 吾律——让普惠法律服务走进生活
  • 【重学 MySQL】一百、MySQL的权限管理与访问控制
  • STM32F103C8T6开发板入门学习——点亮LED灯2
  • RISC-V体系架构
  • 创作纪念日·512天
  • 【芯片设计-信号完整性 SI 学习 1.1 -- 眼图、抖动、反射、串扰】
  • 小迪安全v2023学习笔记(八十讲)—— 中间件安全WPS分析WeblogicJenkinsJettyCVE
  • 【Linux】基础指令(下)
  • linux 环境下Docker 安装
  • Nginx 配置
  • 20250910_《SQL Server 数据库事务日志定期清理方案(精简优化版)》以10.1.1.31服务器的gtp-default数据库为例
  • 多输入(input)多输出(output)验证
  • 排查JSch连接SFTP服务器失败的问题
  • JMeter压测过程中监控服务器CPU及内存的方法