搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
weixin_40725706
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
SpringBoot与机器学习:TensorFlow与MLlib_springboot集成tensorflow
2
NLP-Bert核心知识点权威总结_bert 的块向量有几个
3
500强HR如何筛选简历
4
Redis(二) 可编程性
5
arm64架构鲲鹏、银河麒麟,系统安装docker和docker-compose_arm64 安装docker
6
Python123 作业题答案_python123题库答案
7
将输入字符串中的字符按如下规则排序。 规则 1 :英文字母从 A 到 Z 排列,不区分大小写_c++英文字母排序
8
RT-DETR 训练时无法打印 GFLOPS【官方解决方案来了】_detr训练时打印
9
论文解读19——(PatchTST)A Time Series is Worth 64 Words: Long-term Forecasting with Transformers_patchtst时间空间复杂度
10
传统软件集成AI大模型——Function Calling_大模型function call
当前位置:
article
> 正文
TCP通信实现_tcp通信如何实现
作者:weixin_40725706 | 2024-04-15 05:13:37
赞
踩
tcp通信如何实现
[1] tcp通信原理
1. 建立连接
2. 通信
3. 断开连接
[2] TCP实现流程
1. 头文件
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
2. 数据结构
3. 实现流程(函数)
(1) 服务端
1. 创建监听socket 买手机
/*
* @param[in] domain 通信领域
* @li AF_UNIX, AF_LOCAL 本机通信
* @li AF_INET ipv4
* @li AF_INET6 ipv6
* @li AF_PACKET 底层数据包
* @param[in] type 套接字类型
* SOCK_STREAM 流式套接字(TCP)
* SOCK_DGRAM 报文套接字(UDP)
* SOCK_RAW 原始套接字(IP、ICMP)
* @param[in] protocol 指定使用协议,通常是0
* @return 文件描述符(套接字)
* @li -1 错误(错误码见errno)
*/
int socket(int domain, int type, int protocol);
2. 绑定ip地址(本机)和端口(自己的端口)到监听socket 放SIM卡
/*
* @brief 绑定ip地址(本机的)和端口(自己的)到socket
* @param[in] sockfd 套接字
* @param[in] addr 地址(通信类型、ip地址和端口号)
* @param[in] addrlen addr的字节数
* @return @li 0 绑定成功
* @li -1 错误(错误码见errno)
*/
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
3. listen(将socket设置为监听模式) 开机
/*
* @brief 将socket设置为监听模式
* @param[in] sockfd 套接字
* @param[in] backlog 设置listen队列的最大连接请求个数
* @return @li 0 成功
* @li -1 错误(错误码见errno)
*/
int listen(int sockfd, int backlog);
4. accept(接收客户端连接, 创建客户端socket) 接通
/*
* @brief 接收客户端连接, 创建跟客户端连接的socket
* @param[in] sockfd 监听套接字
* @param[out] addr 客户端地址(ip地址和端口)
* @param[in | out] addrlen 输入地址缓存的字节数,输出实际地址的字节数
* @return 文件描述符(客户端套接字)
* @li -1 错误(错误码见errno)
* @notes listen请求队列为空时,在阻塞模式下,本函数会阻塞
*/
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
5. 利用客户端socket接收/发送数据 说话
/*
* @brief 发送数据(写数据到发送缓冲区)
* @param[in] sockfd 客户端套接字
* @param[in] buf 要发送的数据
* @param[in] len 数据长度
* @param[in] flags 一般为0
* @return 成功发送的字节数
* @li -1 错误(错误码见errno)
* @notes 一个字节都无法发送时,在阻塞模式下,本函数会阻塞
* send(sockfd, buf, len, 0) <===> write(sockfd, buf, len);
*/
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
/*
* @brief 接收数据(读取数据从接收中缓冲区)
* @param[in] sockfd 客户端套接字
* @param[out] buf 放置数据的缓冲
* @param[in] len 缓冲区的字节数
* @param[in] flags 一般为0
* @return 成功读取的字节数
* @li -1 错误(错误码见errno)
* @notes 一个字节都无法接收时,在阻塞模式下,本函数会阻塞
* recv(sockfd, buf, sizeof(buf), 0) <===> read(sockfd, buf, sizeof(buf));
*/
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
6. close客户端socket 挂机
7. close监听socket 关机
int close(int fd);
/*
* @brief 关闭套接字
* @param[in] sockfd 套接字
* @param[in] how 如何关闭?
* @li SHUT_RD 关闭读
* @li SHUT_WR 关闭写
* @li SHUT_RDWR 关闭读写
* @return @li 0 成功
* @li -1 错误(错误码见errno)
*/
int shutdown(int sockfd, int how);
(2) 客户端
1. 创建socket
2. 绑定ip地址(本机)和端口(自己的端口)到socket(可选)
3. 建立连接(connect)
/*
* @brief 连接服务端
* @param[in] sockfd 套接字
* @param[in] addr 服务端地址(ip和端口)
* @param[in] addrlen 地址字节数
* @return @li 0 成功
* @li -1 错误(错误码见errno)
* @notes 正在连接时,在阻塞模式下,本函数会阻塞,但阻塞有超时时间
*/
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
4. 发送/接收数据
5. 关闭socket
[3] udp聊天室
1. 简单的多人聊天
见《4.udp聊天室》
2. 标准聊天
(1) 登陆(功能 名字)
(2) 聊天(功能 内容)
(3) 退出(功能)
1. 制定协议
打包(数据组合) 1. 结构体 2. 按顺序放数据到缓存
1. 结构体分析
typedef struct {
// char c;
// 中间会空3个字节
int func;
char c;
char *p;
} PROL ;
客户端 服务器 错误原因 解决
字节序 小端 大端 func会错误,func有四个字节,字节顺序正好相反 统一使用大端(htonl/ntohl htons/ntohs)
位数 32bit 64bit 机器理解int类型的时候,位数不同 系统没有提供统一方法,程序自己保证位数相同
对齐 32bit 64bit 因为结构体程序对齐,很可能导致中间,空闲的字节 认真设计结构体,是它尽量不出现因为需要对齐,而空出内存
数,不相同而导致解析错误
对于初学者,如果需要考虑数据传输完全正确,不要使用结构体。
2. 按顺序放数据到缓存
最简单的方法,保证协议中的数据都是以字节为单位
300 "300"
2.7 "2.7"
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/weixin_40725706/article/detail/425998
推荐阅读
article
【
数据结构
C++
】
线性
表
-链式
存储
:
链
表
类型
和单
链
表
(定义+代码实现)...
本章我们介绍
线性
表
的链式
存储
——
链
表
。
链
表
类型
、单
链
表
理论知识和
类型
定义,具体函数的代码模板【
数据结构
C++
】
线性
表
-链...
赞
踩
article
探秘
ChatDev
:新一代
对话
式
AI
开发
平台...
探秘
ChatDev
:新一代
对话
式
AI
开发
平台项目地址:https://gitcode.com/OpenBMB/ChatD...
赞
踩
article
mysql
按
月份
统计
常用的方法
_
mysql
按照
月份
统计
次数
以及占比...
1、
统计
某一个月SELECT * FROM 表名 WHERE PERIOD
_
DIFF( date
_
format( now...
赞
踩
article
数据结构
初阶:
二
叉树
(
二
)
...
由于现在对
二
叉树
结构掌握还不够深入,为了降低学习成本,此处手动快速创建一棵简单的
二
叉树
,快速进入
二
叉树
操作学习,等
二
叉树
...
赞
踩
article
【
数据结构
】
顺序存储
线性表
C语言实现_
c
语言
有
listinsert
...
* 文件名:
顺序存储
的
线性表
* 基本操作:* InitList(&L) //构造一个空的
线性表
L* DestoryLis...
赞
踩
article
人工智能
报告
_
中国
人工智能
产业
生态图谱
2019
.pdf...
2019
1013文章不断更新中.....
2019
全球
人工智能
发展白皮书
2019
年
中国
人工智能
产业
发展指数
2019
年人工智...
赞
踩
article
[梦中一夜下江南总结]
Spring
Boot整合
Spring
-
cloud
-
alibaba
并配置微
服务
之...
都需要
cloud
,需要在
cloud
基础上。先
集成
cloud
第one步开 https://mvnrepository.co...
赞
踩
article
MySQL
数据库
基础(
MySQL
表的
增删
改查
--
进阶
)_
mysql
增删
改查
语句
进阶
...
MySQL
表的
增删
改查
(
进阶
)1.
数据库
约束约束:
数据库
针对数据进行一系列的校验,如果发现插入的数据不符合约束中的描述...
赞
踩
article
Linux学习-
网络
UDP
...
数据发出后,对方没有接收完整,返回ACK告知发送方自己接受多少数据,然后发送方会再次进行缺失数据的发送以保证数据完整。d...
赞
踩
article
字节跳动
面试
分享
,
android
内存优化
面试
题...
一. 开发背景想要成为一名优秀的Android开发
,
你需要一份完备的知识体系
,
在这里
,
让我们一起成长为自己所想的那样。我...
赞
踩
article
【
AI
绘画】免费GPU Tesla A100 32G算力部署
Stable
Diffusion
_sta...
Stable
Diffusion
是一个基于深度学习的图像生成工具,它使用扩散模型生成高质量的图像。该项目由AUTOMAT...
赞
踩
article
【
Spark
NLP
】第
10
章:
主题
建模_
unique
term
语料库
...
这些值可以是二进制的,表示单词的存在,或者一个术语出现的次数,或者它们可以是 TF.IDF 值。一旦我们有了这样一个矩阵...
赞
踩
article
可信
安全
网络
——
安全
左移之
DDoS
对抗
...
文|宙斯盾
DDoS
防护团队Rains
DDoS
的开始互联网对人类文明的进步影响,不亚于蒸汽机发明对人类文明的影响。当人们享...
赞
踩
article
el
-
table
那些事_
el
-
table
获取
所有
行...
1、
获取
el
-
table
所有
勾选的行数据 2、
el
-
table
自定义列标题 3、
el
-
table
列可编辑,加入e...
赞
踩
article
玩玩
Flutter
Web
—— 实现高德
地图
插件_
flutter
map
web
...
1.啰嗦几句去年写了一个功能简单的高德
地图
插件给
flutter
_deer使用,当时支持了Android与iOS两端。前一...
赞
踩
article
2023最新
java
学习
教程
(
学习
路线+
课程
大纲+
视频
教程
+面试题+
学习
工具)_
java
课程
简介...
千锋教育2019最新
java
学习
教程
汇总(
学习
路线+
课程
大纲+
视频
教程
+面试题+
学习
工具)目录一、首先要了解什么是JAV...
赞
踩
article
【书籍分享 • 第一期】
基于
GPT
-3、
Chat
GPT
、
GPT
-4等
Transformer
架构的自然...
【好书分享 • 第一期】——
基于
GPT
-3、
Chat
GPT
、
GPT
-4等
Transformer
架构的
自然语言
处理_
基于
g...
赞
踩
article
Stable
Diffusion
3重磅发布_
stable
diffusion
3.0...
提示(意译版):在一幅充满史诗感的动漫画面中,一位巫师屹立于夜幕笼罩的山巅之上,正用他的法杖向漆黑无垠的夜空中施展一道震...
赞
踩
article
linux
scada
linux
组态软件 跨平台组态...
.想要了解更多,欢迎您加q 2653551899 技术交流,及时获得更多信息。····2020.11.28新增:新建了个...
赞
踩
article
Python m
a
tplotli
b
.pyplot常用方法_plt.
text
(
a
,
b
+ 0.05
,
...
Python m
a
tplotli
b
.pyplot常用方法_plt.
text
(
a
,
b
+ 0.05
,
'
%.2f
'
% ...
赞
踩
相关标签
数据结构
c++
链表
数据库
mysql
java
linux
学习
网络
经验分享
面试
android
AI作画
stable diffusion
飞桨
spark
自然语言处理
算法
区块链
人工智能
大数据
vue.js
elementui