socket 1---UDP编程

目录

一、port

二、网络数据的五元组信息(源IP,目的IP,源端口,目的端口,协议)

三、网络字节序

3.2 主机字节序与网络字节序的相互转换

 四、TCP和UDP协议特点和区别

4.1、UDP:

 4.2、TCP

五、UDP_socket 编程

5.1、编程流程

5.2、接口

5.2.2创建套接字的接口

5.2.3绑定接口

5.2.4发送消息

 六、代码实现

1、服务端代码

2、客服端代码:

3、排查问题

4、关于udp的几个疑问


一、port

本质 : 端口号是一共2字节16位整数,范围是[0,65535];

         ssh://zhangyunfei:***********@124.222.51.214:22

作用:端口号用来标识一个进程,告诉操作系统,当前的这个数据要交给哪一个进程来处理,

socket 1---UDP编程_第1张图片

  注意: 一共端口号只能被一个进程所占用,一个进程可以占用多个端口号(在同一台机器当中)

一些知名端口:

1~1023 范围内的端口已经被一些知名的协议所使用,我们在编写代码的时候不要使用该范围内的数据作为端口号
Oracle----1521

MySQL----3306

socket 1---UDP编程_第2张图片

二、网络数据的五元组信息(源IP,目的IP,源端口,目的端口,协议)

源IP:        标识网络数据是哪台主机发出

目的IP:    标识数据要去往哪一台主机

源端口:    标识网络数据是从“源IP”对应的这台主机的哪个进程产生

目的端口:通过目的IP找到目的主机之后,需要利用目的端口找到对应的进程

协议:       标定双方传输数据时使用的协议,一般是UDP/TCP

socket 1---UDP编程_第3张图片

结论:在网络当中传输的信息,都是包含五元组信息的 !

三、网络字节序

小端字节序:低位放在低地址

大端字节序:低位放在高地址

socket 1---UDP编程_第4张图片

 网络字节序:规定网络传输数据的时候采用大端字节序进行传输

主机字节序:指的是机器本身的字节序,如果是大端,则主机字节序为大端,如果是小端,则主机字节序为小端

3.2 主机字节序与网络字节序的相互转换

转换的过程如下:

socket 1---UDP编程_第5张图片

两个接口: 

主机字节序转换为网络字节序:

socket 1---UDP编程_第6张图片

 网络字节序转换为主机字节序:

socket 1---UDP编程_第7张图片

 四、TCP和UDP协议特点和区别

4.1、UDP:

无连接:             UDP双方在发送数据之前, 是不需要进行沟通的。 只需要知道对方的ip和端口就好(可能对方进程还没有准备好),就可以发送,          (这就好比你给一个人发微信不用关心对方是否在线)

不可靠:              不保证UDP数据是可靠,有序的到达对方

面向数据报:      UDP和应用层/网络层递交数据的时候, 都是整条数据进行交付的

socket 1---UDP编程_第8张图片

 4.2、TCP

面向连接:       TCP双方在发送数据之前会先建立连接。 (1.确保对方正常能通信, 2.沟通双方发送后续数据的细节(例如序号 ) )
可靠传输:       TCP保证传输的数据是可靠、有序的到达对端的
面向字节流:
1.对于传输的数据没有明显的边界
2.对于接收方而言,可以按照任意的字节进行接收

socket 1---UDP编程_第9张图片

五、UDP_socket 编程

5.1、编程流程

客户端 --服务端

socket 1---UDP编程_第10张图片

 创建套接字的含义:

1、将进程和网卡进行绑定,进程可以从网络协议栈中接收或者发送数据

 绑定地址信息的含义:

1、给进程绑定ip,绑定端口。为了在网络当中标识一台主机和一个进程

这样一来,对于接收方而言,发送数据的人就知道接受方的在哪台机器的哪个进程了;对于发送方而言,能够标识网络数据是从哪台机器的哪个进程发送出去的。

5.2、接口

5.2.2创建套接字的接口

int socket ( int domain, int type,  int protocol );

socket 1---UDP编程_第11张图片

5.2.3绑定接口

int  bind   (int  sockfdconst  struct  sockaddr*   addr,  socklen_t   addrlen);

参数:
sockfd-----创建套接字时返回的套接字描述符
addr-----绑定的地址信息(IP + port)
addrlen----绑定的地址信息的长度

socket 1---UDP编程_第12张图片

疑问 :

socket 1---UDP编程_第13张图片

5.2.4发送消息

socket 1---UDP编程_第14张图片

 5.2.5接收消息&关闭消息

socket 1---UDP编程_第15张图片

 六、代码实现

1、服务端代码

 socket 1---UDP编程_第16张图片

 netstat  -anp |  grep  [端口号]  , 查看端口的监听情况

socket 1---UDP编程_第17张图片

2、客服端代码:

socket 1---UDP编程_第18张图片

1、验证udp的不可靠性:

socket 1---UDP编程_第19张图片

 2、客户端和服务端都启动时,看会是怎么样的

socket 1---UDP编程_第20张图片

 我们可以看到,server并没有收到任何数据,这时候去观察下客户端的调用堆栈,发现已经在sleep了,

说明肯定已经发送了数据,只不过服务端没有收到数据。

3、排查问题

1、关注客户端发送数据的时候,给的ip和端口到底对不对

2、关注防火墙

我们这时候进入我们的腾讯云去修改下防火墙的设置

添加udp规则

socket 1---UDP编程_第21张图片

 修改过后,我们再来让程序跑起来试一下:

socket 1---UDP编程_第22张图片

 我们可以看到能够接收到数据了

3、利用本地回环地址“127.0.0.1”

将客户端的地址改为本地回环地址 “ 127.0.0.1 ”,测试当前机器的网络协议栈是否是好着的

socket 1---UDP编程_第23张图片

4、关闭自己机器的防火墙

进入root用户中将防火墙关闭掉

 开启防火墙的命令是start

socket 1---UDP编程_第24张图片

4、关于udp的几个疑问

问题1、为什么不推荐客户端绑定地址信息呢?

首先明确:客户端是可以绑定的

我们先来进行绑定,然后试一下能不能行

socket 1---UDP编程_第25张图片

 socket 1---UDP编程_第26张图片

 我们可以发现,绑定过后确实是能够让程序正常执行的

不推荐的原因:

如果客户端绑定了地址信息,那么在一台机器当中,就不能多开多个客户端,因为一个端口只能被一个进程所绑定

socket 1---UDP编程_第27张图片

 在我们不绑定的时候,就可以多开

socket 1---UDP编程_第28张图片

问题2、为什么客户端没有绑定地址信息,但在发送数据的时候却有ip和端口呢?

原因:客户端调用的sendto函数会默认给客户端绑定地址信息

问题3、可不可以持续发送消息?

当然可以

socket 1---UDP编程_第29张图片

 问题4、服务端可以给客户端发送消息吗?

肯定可以,但是服务端必须知道客户端ip和端口才能通信

服务端向客户端发信息:

 socket 1---UDP编程_第30张图片

客户端代码增加:

 socket 1---UDP编程_第31张图片

 我们来观察一下现象:

可以发现双方在互相发送消息。

socket 1---UDP编程_第32张图片

你可能感兴趣的:(Linux,网络)