IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 网络套接字编程(未完成) -> 正文阅读

[网络协议]网络套接字编程(未完成)

套接字编程: 即网络通信程序的编写.

网络中的通信都是两端主机之间的通信: 客户端和服务端
客户端:网络通信中用户的一端,是进行业务请求的一端,是主动发起请求的一端
服务端:网络通信中提供服务的一端,针对客户端请求进行处理的一端,是被动接收请求的一端?

qq聊天并不是自己跟另一个手机或者电脑用户在通信,实际上是跟腾讯的服务器在进行通信,把一个消息发到某个群,其实是把数据发送给了服务器,描述了数据在哪个群,服务器就能找到群里有哪些用户,这些用户也登录了服务器,就可以把数据逐一发送给对应的主机。

不存在客户端与客户端的通信,不存在服务端与服务端的通信。

网络通信编程有: tcp协议通信程序的编写, udp通信程序的编写

tcp协议和udp协议的区别初识:
tcp协议∶传输控制协议--面向连接,可靠的字节流传输协议(确保数据安全有序到达对端)
tcp协议为了保证可靠传输,因此使用了很多处理机制来完成,因此传输性能相对于udp较低tcp协议的应用场景:安全要求大于性能要求。比如文件传输
udp协议:用户数据报协议--无连接,不可靠的数据报传输协议(不确保数据安全有序到达对端)
udp协议不需要保证可靠传输,只需要尽管传输就行因此传输性能要更高一些
udp协议的应用场景:性能要求大于安全要求。比如视频数据传输(要求不卡)

UDP通信程序的编写:

网络传输中的数据都会具有五元组: sip(源端ip地址), sport(源端端口),dip(对端ip地址),dport(对端端口),protocol(使用的协议)

客户端要给服务端发送数据,他怎么知道服务端是谁?
服务端都会提前将自己的地址信息封装在客户端程序中。也正是因为如此,服务端的地址信息通常都不能随意改变。

udp通信流程*:

接口认识:

1. 创建套接字: int socket(int domain, int type, int protocol)

domain: 地址域类型,决定通信使用的地址结构, IPV4地址域类型为AF_INET

type:套接字类型,决定套接字传输方式, SOCK_DGRAM:无连接的,不可靠的数据报传输服务(UDP). SOCK_STREAM:基于连接的有序的可靠的字节流传输服务(TCP).

protocol: 决定使用的协议类型, IPPROTO_TCP, IPPROTO_UDP.?

返回值: 套接字的操作句柄(文件描述符),用于后续接口传参操作.?失败返回-1.

2. 绑定地址信息: int bind(int sockfd, struct sockaddr *addr, socklen_t len)

sockfd: socket()返回的操作句柄, 决定了给哪个套接字绑定地址信息

addr: 绑定的地址信息.??struct sockaddr是通用地址结构, 一般不使用这个类型根据上面socket()的domain对应的地址结构决定, 传参时强转为通用的就行. IPV4地址结构为sockaddr_in, IPV6为sockaddr_in6.?(因为使用的地址域多种多样, 地址结构不同,但bind接口只有一个,所以统一用通用的作为传入,bind接口内部会根据前2个字节决定传入的地质结构该如何解析.)

len: 地址信息长度. 指定前一个参数的长度, 防止访问越界

所以常写为: bind(sockfd,(sruct sockaddr*)& addr, sizeof(addr))

返回值:?成功返回0,失败返回-1.

3.发送数据:

ssize_t sendto(int sockfd, void* buf, int len, itn flag, struct sockaddr* peer_addr, socklen_t len)

sockfd: socked()返回的操作句柄.

buf:?要发送的数据首地址.

len:?发送数据的长度.

flag: 标志位, 0默认为阻塞操作.?

peer_addr: 对端地址信息(接收数据那端). 也是根据对应的强转为通用的

addrlen: 地址信息长度

返回值: 成功返回实际发送的数据长度, 失败返回-1.

4.接收数据:

ssize_t recvfrom(int sockfd, void* buf, int len, int flag, struct sockaddr* peer_addr, socklen_t* addrlen)

sockfd: socked()返回的操作句柄.

buf:?要存放数据的一块缓冲区空间首地址.

len: 要获取的数据的长度.

flag: 标志位, 0默认为阻塞操作. 缓冲区没有数据则等待.

peer_addr: 获取数据的源端地址信息(发送数据那端), 创建一个strcut sockaddr_in传入recvfrom接口内部会使之接收,?也是根据对应的强转为通用.(客户端实际上不需要获取服务端地址信息,因为本来就封装有了)

addrlen: 输入输出参数, 用于指定要获取的地址长度以及返回的实际长度

返回值: 成功返回实际收到的数据长度, 失败返回-1.

5.关闭套接字: int close(int sockfd)

字节序转换接口*:

网络通信使用的是网络字节序, 因此需要字节序转换.?

16位数据主机与网络字节序转换: uint16_t? htons(unit16_t port),? uint16_t ntohs(uint16_t port)

32位数据主机与网络字节序转换: uint32_t? htonl(uint32_t ip),??uint32_t? ntohl(uint32_t ip)

host to net 主机转网络, net to host网络转主机,?不限于port和ip的转换.

绑定时,把指定端口用htons()转后赋给sin_port. 不能用htonl,且用自己的主机地址(虚拟机地址)

接收数据时把数据发送端的地址信息中sin_port用ntohs()转出来.

将点分十进制的字符串ip地址转换为网络字节序整数的ip地址(IPV4):

in_addr_t? ?inet_addr(char* ip) 转之后赋给sin_addr.s_addr

将网络字节序整数的ip地址转换为点分十进制的字符串ip地址(IPV4):

char*? ?inet_ntoa(struct in_addr sin_addr), 注意这个参数不需要深入到in_addr里的in_addr_t

而上面的返回值是深入到in_addr_t

inet_ntop() / inet_pton(): IPV4和IPV6都可以

查看网络连接状态的命令:

netstat
-a查看所有信息
-n不以服务名称显示(使22端口不被显示成为ssh,127.0.0.1不被显示为localhost等..)

-p查看对应网络状态信息所属的进程
-t tcp连接信息;

-u udp连接信息
?

实现构建思路:

首先使用C语言编写udp服务端程序---了解接口的实际使用与细节流程
接下来使用C++封装一个UdpSocket类, 客户端通过实例化这个类实现客户端的搭建. 因为客户端不需要知道接收发送等接口如何实现,只需要去使用.

udp_srv.c:

udp_socket.hpp:

udp_client.cpp:

?实现效果:

上图展现了不同客户端, 由于没绑定, 不同的客户端发送消息给服务端操作系统就会自己分配不同的地址信息(端口,由于咱虚拟机ip不是动态分配的固定192.168.170.128所以ip地址没变).?

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-01-14 02:22:35  更:2022-01-14 02:22:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 11:37:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码