目录
1.网络协议
2.网络字节序
3.socket编译接口
4.sockaddr结构体
5.模拟实现
1.socket函数
2.bind函数(绑定)
1.讲解
1.如何快速的将 整数ip<->字符串
2.ip地址的注意事项
3.端口号的注意事项
3.recvfrom函数
4.sendto函数
5.代码呈现
6.运行结果
7.开放UDP端口
8.更加体验这个udp的网络协议
建议不懂网络基础知识的先看一下这篇:网络基础知识-CSDN博客
1.网络协议
1.认识TCP协议
(1)传输层协议(2)有连接(3)可靠传输(4)面向字节流
2.认识UDP协议
(1)传输层协议(2)无连接(3)不可靠传输(4)面向数据报
3.注意
上面的有无连接,就是传输层和应用层是否建立连接,TCP连接就是客服端要想服务器发起申请链接,然后才能发送,但是UDP不管你。注意,两个没有好坏之分,都是褒义词,就像金属属性有惰性程度。简历链接的成本也是很大的!
2.网络字节序
我们刚开始学习C语言时,不知道你们有没有了解过大小端存储,没有的可以了解一下。但是网络协议出现的肯定是比大小端出现的晚,并且但是大小端当时没有谁有明显的优势,所以也不好替代谁,那么在网络传输时就出现问题了。所以TCP/IP协议规定,网络数据流一律采用大端字节序,即低地址高字节。
当然C语言肯定会提供接口的,不需要我们自己传唤。
3.socket编译接口
这个先了解一下,具体的下面会说。
4.sockaddr结构体
注意上面函数有一个结构体sockaddr的,其实它是有三个结构体:
对应的套接字编程的种类:1.原始套接字编程--网络工具(一般是跳过传输层进行编译)2.网络套接字编程--用户间的网络通信3.域间套接字--同一个机器内。
但是为什么上面函数只用一个sockaddr,就是想将网络接口统一抽象化,因此传输类型必须是一样的。其实判断也是很简单的:
5.模拟实现
1.socket函数
domain就是上面sockaddr结构体的AF_INIT和AF_UNIX,type就是选择的upd协议:
返回值,如果失败返回-1:
2.bind函数(绑定)
1.讲解
sockfd就是socket的返回值大小,addr则是绑定的ip地址,端口号等等信息,addrlen就是sizeof(addr)就好了。
当然最重要就是初始化addr:
先看看该类型的成员吧:
1.如何快速的将 整数ip<->字符串
就是将四个值都存储下来,注意将字符串转ip时,这样用一下引用,就会很简便的求出uint32_t ip了。ip转字符串就正常来就好了。
2.ip地址的注意事项
假设我们绑定当前账户的ip地址,会出现什么情况呢?
首先:虚拟机中代码是可以运行的,但是云服务是禁止直接bind公网IP,因为什么呢?因为一台主机的ip地址可能不止一个,可能是多个,但是你但凡绑定后,别人法另一个ip地址,你就接受不到了!所以一般默认是"0.0.0.0"。
3.端口号的注意事项
后面输入的是绑定的端口号
[0,1023]是系统内定的端口号,一般都要有固定的应用层协议使用,http:80,https:443, mysql:2206(特殊的)。所以一般设置大于1023的端口号!
可以通过netstate -naup来查看自己设定的ip和端口号。
3.recvfrom函数
作用:接受别人发送来的数据。
buf就是接受别人发来数据的缓冲区,len就是buffer的长度,flags默认为0就好了,下面两个就是接受方要知道是谁发来的数据,到时候好发送回给对方。
4.sendto函数
作用:发送给别人的函数
参数和上面的没什么区别了。
5.代码呈现
Makefile:
main.cc
UdpServer.hpp
UdpClient.cc
log.hpp
Linux命名管道-CSDN博客
我在这上面写过。
6.运行结果
7.开放UDP端口
一般人运行上面程序是不会成功的,因为我们没有开放端口号,所以链接不到主机上。
解决一:
在买的云服务器的安全组里开:
解决二:
由于我在xshell上面修改了tcp的端口,所以再在华为云上修改udp导致web无法同步到上面,所以只能在linux上直接改防火墙:
8.更加体验这个udp的网络协议
很多人感觉这个进程间通讯没什么区别,那么可以让你们体验一下网络间通讯:
将这个压缩到桌面上,发给你的好朋友。