首页 > 系统相关 >linux c++ tcp

linux c++ tcp

时间:2023-09-08 15:12:25浏览次数:32  
标签:IP TCP 连接 c++ linux tcp 接字 服务端 客户端

1. TCP/IP协议栈

链路层:负责下图所示物理链接标准

IP层(网络层):选择合适的路径传输数据,无法解决数据传输错误问题,所以需要TCP/UDP协议作为保障

TCP/UDP(传输层):IP层(网络层)解决传输路径问题,确定了路径,就进行传输数据,IP层只关注一个数据包如何进行传输,至于传输过程数据包是否损坏,传输多个包顺序的控制,IP层无法解决,上述的问题都由TCP/UDP(传输层解决),TCP/UDP(传输层)在IP层(网络层)之上,决定主机之间数据传输方式,给不可靠IP协议赋予可靠性。

应用层:提供封装将上述的几个层进行封装,提供给外部socket(套接字)让我们进行编程,我们进行编写的代码一般都是在编写应用层协议。

2. 实现基于TCP的服务器与客户端

2.1 TCP服务器默认调用函数顺序

调用socket函数创建套接字,声明并初始化地址信息结构体变量,调用bind函数向套接字分配地址。

2.1.1 进入等待请求连接状态 listen()

服务端调用listen()函数进入等待请求连接状态,等待客户端连接,此时客户端才可以调用connect()函数进行连接。

2.1.2 受理客户端连接请求

2.2 客户端调用顺序

2.2.1 客户端向服务端请求连接

2.2.2 客户端套接字信息赋值

2.3 基于TCP的服务端/客户端函数调用关系

3. TCP原理

3.1 TCP套接字中的/O缓冲

3.2 TCP内部工作原理1:与对方套接字的连接

3.3 TCP内部工作原理2:与对方主机的数据交换

3.4 TCP的内部工作原理3:断开与套接字的连接

TCP存在粘包问题(TCP没有数据边界),
解决方式:
1. 发送固定长度的消息
2. 把消息的尺寸与消息一块发送
3. 使用特殊标记来区分消息间隔

我解决的方式是客户端在发送的时候确定发送的数据长度,客户端接受服务端的数据每次读取一个字节,

如果确定客户端之前发送了20个字节的数据那么,循环read20次读取,但是实际实现的时候一般是一次性就读取了一次read读取了所有的数据。

标签:IP,TCP,连接,c++,linux,tcp,接字,服务端,客户端
From: https://www.cnblogs.com/chenruiwe/p/17681973.html

相关文章

  • 迅为RK3588在 Linux 系统中使用 NPU
    下载rknpu2并拷贝到虚拟机Ubuntu,RKNPU2提供了访问rk3588芯片NPU的高级接口。下载地址为“iTOP-3588开发板\02_【iTOP-RK3588开发板】开发资料\12_NPU使用配套资料\01_rknpu2工具”对于RK3588来说,Linux平台RKNNSDK库文件为librknnrt.so,RK3588平台RKNNSDK包......
  • C++ 归并排序
    #include<iostream>#include<vector>usingnamespacestd;///合并voidmerge(vector<int>&nums,intl1,intr1,intl2,intr2,vector<int>&tmp){ intleft=l1,right=r2;intk=l1;while(l1<=r1&&......
  • 迅为RK3588在 Linux 系统中使用 NPU
     下载rknpu2并拷贝到虚拟机Ubuntu,RKNPU2提供了访问rk3588芯片NPU的高级接口。下载地址为“iTOP-3588开发板\02_【iTOP-RK3588开发板】开发资料\12_NPU使用配套资料\01_rknpu2工具”对于RK3588来说,Linux平台RKNNSDK库文件为librknnrt.so,RK3588平台RKNNSD......
  • 深度分析一下标准协议modbus TCP IP和modbus RTU的优劣【以温湿度传感器为例】
    原标题:RS485信号输出的温湿度传感器和RJ45信号输出的温湿度传感器深入分析拓展485信号输出的温湿度传感器 modbusTCP/IP协议和modbusRTU协议是两种不同的通讯协议,它们在通讯方式、数据格式和适用场景等方面存在一定的差异。下面将对这两种协议进行详细介绍和比较。一、mod......
  • linux 中 awk命令实现文件按列精确匹配合并
     001、[root@pc1test01]#cata.txtA:10B:5C:12[root@pc1test01]#catb.txt100A50B88K99Y42C[root@pc1test01]#awk'{if(NR==FNR){ay[$1]=$2}else{print$2,$1,ay[$2]}}'FS=":"a.txtFS=""b.txtA10010......
  • Androidstudio现有文件中添加C、C++文件 (NDK)
    创建新的C/C++源代码文件1.如果应用的主源代码集内还没有cpp/目录,请按如下所示的方法创建一个:1.1打开AndroidStudio左侧的Project窗格,然后从菜单中选择Project视图。1.2依次选择your-module>src。1.3右键点击main目录,然后依次选择New>Dire......
  • linux 中awk命令同时多多个文件指定分隔符
     001、正确做法[root@pc1test01]#lsa.txtb.txt[root@pc1test01]#cata.txtA:10B:5C:12[root@pc1test01]#catb.txt100A50B42C[root@pc1test01]#awk'{if(NR==FNR){print$2}else{print$1}}'FS=":"a.txtFS=""b......
  • linux 中 awk命令实现文件按列匹配
     001、方法1[root@pc1test01]#lsa.txtb.txt[root@pc1test01]#cata.txtA:10B:5C:12[root@pc1test01]#catb.txt100A50B42C[root@pc1test01]#awk-F"[:]"'{if(NR==FNR){ay[$1]=$2}else{print$2,$1,ay[$2]}}'a.txtb......
  • linux 中awk命令指定读入分隔符
     001、-F指定[root@pc1test01]#lsa.txt[root@pc1test01]#cata.txta:b:c3:8:kf:6:3[root@pc1test01]#awk-F":"'{print$1}'a.txta3f 002、-vFS变量指定[root@pc1test01]#lsa.txt[root@pc1test01]#cata.txta:b:c3:8:k......
  • Linux shell 环境变量 All In One
    Linuxshell环境变量AllInOne全局环境变量,systemwideenvironment系统级环境变量局部环境变量,localwideenvironment用户自定义环境变量shell的3种启动方式登录默认的交互式shell非登录的交互式shell运行脚本的非交互式shellshell的常见类型shba......