搜索
查看
编辑修改
首页
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
javascript基本和常用的东西
2
尝试在手机上运行google 最新开源的gpt模型 gemma
3
apache-dolphinscheduler-3.2.0伪集群启动,采用mysql数据库_dolphinscheduler3.2.0伪集群部署
4
自我摸索:如何运营并玩转CSDN?_如何运营csdn
5
字节跳动应届生薪资都能2万+,年薪30万,这样工作真的开心吗?_字节离职率很高吗
6
【基于遗传算法改进的粒子群GA-PSO算法优化shubert函数及MATLAB编程实现,测试函数shubert(十)
7
怎样找回删除的照片?学会这4招,恢复超简单!_照片删除了怎么恢复回来
8
基于FPGA的PCIe-Aurora 8/10音频数据协议转换系统设计阅读笔记_pcie aurora 收发工程
9
红黑瓷砖(BFS和DFS)
10
[Distributed Training]强化学习并行训练论文合集_ga3c: gpu-based a3c for deep reinforcement learnin
当前位置:
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
BERT
大火却不懂
Transformer
?读这一篇就够了_
bert
多头
机制
向量
维度...
大数据文摘与百度NLP联合出品编译:张驰、毅航、Conrad、龙心尘编者按:前一段时间谷歌推出的
BERT
模型在11项NL...
赞
踩
article
c
语言实现
线性表
的
链式
存储
,
线性表
的
顺序
存储
和链式
存储
c
语言实现...
一.
线性表
的
顺序
存储
typedef int ElemType;typedef stru
c
tList{ElemType*d...
赞
踩
article
hive
外部
表
修改
表
属性内容...
再次使用上面的 select 语句验证是否
修改
了,进入
hive
执行。确认获取的值是不是唯一的,依据情况使用下面的 u...
赞
踩
article
软考中级
网络
工程师-
计算机
基础
理论
与
安全
-第三节
存储技术
基础
...
这种备份方式最显著的优点就是:没有重复的备份数据,因此备份的数据量不大,备份所需的时间很短。PGP(Pretty Goo...
赞
踩
article
29
道
Zookeeper
面试题
超详细(附答案)
_
zookeeper
的
面试题
...
ZooKeeper是一个分布式
的
,开放源码
的
分布式应用程序协调服务,是Google
的
Chubby一个开源
的
实现,是Had...
赞
踩
article
【
Python
】
Python
中实现
数据
序列化
_
python
序列化
...
本文介绍了如何在
Python
中实现
数据
序列化
_
python
序列化
python
序列化
...
赞
踩
article
人工智能
与大
数据
时代
-
2019
_泰尔
张建东
...
文章不断更新中.....
2019
1013白皮书丨大
数据
产业发展呈现八大趋势《
2019
中国大
数据
产业发展白皮书》深度解读之...
赞
踩
article
在
docker
下的
homeassitant
安装
HACS
_
docker
hacs
...
最近鼓捣智能家居想用群晖搭载homeassistant,然后接入米家已经在群晖中安装Docker并已经配置好了docke...
赞
踩
article
Stable
Diffusion本地部署教程_
stable
diffusion
本地部署
csdn
...
Stable
Diffusion本地部署教程_
stable
diffusion
本地部署
csdn
stable
diff...
赞
踩
article
延迟
享受
,
在
最好
的
年纪请不要选择安逸_
延迟
享受
生活例子怎么写...
延迟
享受
,
简单来说
,
是一个先吃苦
,
后有甜
的
过程。古人云“吃得苦中苦
,
方为人上人”。许多人都明白这个道理
,
但就是控制不住自...
赞
踩
article
使用
Git
Bash
上传代码到码云
Git
ee_
git
bash
git
ee...
1.下载
Git
Bash
文件,下载安装成功后可以在桌面点击右键,可以看到
Git
Bash
Here2.之后我们打开码云...
赞
踩
article
netapp
linux
ntfs
,如何在
NetApp
文件中使用
fsecurity
apply
來重置...
I have a
NetApp
filer, with a CIFS export. The permissions h...
赞
踩
article
使用
Git
Bash
上传本地文件到
git
ee仓库中_怎么用
git
bash
上传...
git
pull --rebase origin master 是一个
Git
命令,用于从远程仓库 origin 的 ...
赞
踩
article
【
Hive
】
函数
_
hive
explode
...
指定分析
函数
工作的数据窗口大小,这个数据窗口大小可能会随着行的改变而变化。当前行往前n行数据往后n行数据起点表示从前面的...
赞
踩
article
mysql
预
编译的好处_
Mysql
预
处理
PREPARE
以及
预
处理
的好处...
Mysql
预
处理
PREPARE
以及
预
处理
的好处
Mysql
手册
预
处理
记载:
预
制语句的SQL语法在以下情况下使用:· 在...
赞
踩
article
阿坤
老师
的蓝桥
魔方
_
c
语言
阿坤
老师
的
魔方
挑战...
阿坤
老师
的蓝桥
魔方
。_
c
语言
阿坤
老师
的
魔方
挑战
c
语言
阿坤
老师
的
魔方
挑战
阿坤
老师
...
赞
踩
article
P8753
[
蓝桥
杯
2021
省
AB2
]
小
平方...
注意:
小
于 n/2 这个值可以有
小
数,因此先将n转化为浮点数再判断。同理,也可以先判断n的奇偶性,再分情况判断。P875...
赞
踩
article
kafka
和
rocketmq
区别对比...
Kafka和RocketMQ是目前非常流行的分布式消息系统,它们都能够高效地处理海量的消息数据。在本文中,我们将对Kaf...
赞
踩
article
遗传算法
--
基础
VRP
--
白话文版笔记(附逐句详细解释)_
vrp
问题
归一化
...
from tqdm import * # 进度条J = []pop = getpop(length, geneNum) ...
赞
踩
article
Git
安装
、关联
git
ee_
安装
git
目录没有关联...
git
安装
教程、关联
git
ee_
安装
git
目录没有关联
安装
git
目录没有关联 官网
Git
(gi...
赞
踩
相关标签
c语言实现线性表的链式存储
hive
hadoop
数据仓库
网络
安全
服务器
学习笔记
软考
zookeeper
面试题
python
开发语言
docker
容器
运维
stable diffusion
AI作画
ai
github
经验分享
图像处理
延迟享受
奋斗