网络编程 --- UDP

10 篇文章 0 订阅

网络编程 --- UDP

前面我们实现的TCP网络编程,是基于TCP协议的,也是面向连接的字节流服务,这就是我们在创建socket的时候,socket函数的第二个参数总是指定为SOCK_STREAM,第三个参数protocol总是设置为0,即默认使用TCP协议。

所以我们先来看一看TCP和UDP编程上的区别:

  • TCP是有连接的,比如打电话,首先得拨号码(connect),接通电话(accept),然后各自拿着自己的话筒(socket)进行通讯。
  • 但是UDP是不同的,UDP是无连接的,比如发短信。当然,如果要使用无连接的数据报服务,我们在创建socket的时候,得要把socket函数的第二个参数设置为SOCK_DGRAM,同时第三个参数设置为0,表示使用默认的UDP协议。

有关TCP协议和UDP协议的细节,将在后面的博客中进行讨论,这里主要关注的是如何实现UDP的网络编程。

 

UDP网络编程步骤如下:

由于UDP协议不需要建立连接,所以不需要被动socket,因此监听socket函数listen就用不到了。另外,不论是TCP通信还是UDP通信,socket都需要和套接字地址进行绑定,这是因为对于服务器来说,如果自身的地址不固定的话,那么客户端就无法找到服务器进行通信了。

 

服务器端程序编写流程:

  • 创建socket
  • 将socket通过bind函数与套接字地址绑定在一起
  • 使用recvfrom函数接收数据
  • 使用sendto函数发送数据
  • 关闭连接(socket)

 

客户端程序编写流程:

  • 创建socket
  • 这一步不需要,详情见下面
  • 使用sendto函数发送数据
  • 使用recvfrom函数接收数据(这里调用recvfrom时,最后两个参数可以传NULL,服务器端的地址,我们不用接收了,我们本来就知道)
  • 关闭连接(socket)

第二步不写的原因:在客户端中,我们一般不需要去给socket绑定一个套接字地址,当然绑定了也不会错,但是这样并没有什么意义,而且如果在一个主机上多次启动这个客户端进程还会出错,所以一般我们这里不给socket绑定套接字地址,直到客户端进程调用了sendto函数的时候,系统会为客户端进程随机分配(bind)一个合适的套接字地址。

 

UDP网络编程我们就不需要一步步的看了,因为好多的内容都在上一篇博客中写到了,所以这篇博客主要探究一下新的内容,比如recvfrom和sendto函数。

相信看过上一篇博客的都知道我们TCP通信的时候,使用的是recv和send函数,那么这里为什么不接着使用recv和send函数呢,而是使用了新的recvfrom和sendto函数?

答:我们先来了解一下这两个函数,就会发现它在UDP通信中的优点了。

  •  recvfrom读取sockfd上的数据,buf和len参数分别指向读缓冲区的位置和大小。因为UDP通信没有连接的概念,所以我们每次读取数据的时候都需要获取发送端的socket地址,即参数src_addr所指的内容,addrlen参数指定该地址的长度。
  • sendto往socket上写入数据,buf和len参数分别指向写缓冲区的位置和大小。dest_addr参数指定接收端的socket地址,addrlen参数则指定该地址的长度。
  • 这两个函数的flags参数以及返回值和recv/send系统调用含义一致,另外特别注意这两个函数的最后一个参数,sendto传入的是整型值,而recvfrom传入的是指针
  • 当然,这两个函数也可以直接用于面向对象连接(STREAM)的socket的数据读写,只需要将最后两个参数全部设置为NULL即可,因为已完成连接,已经知道其socket地址了。
  • 最后,这两个函数在阻塞IO下,都可能会阻塞,recvfrom函数会一直阻塞到有数据到来。sendto函数也一样,如果缓冲区满了,会阻塞。

 

最后,相对于TCP编程,UDP简单了很多,所以这里只贴一些UDP网络编程中主要步骤的代码:

服务器端主要代码:

 

 

客户端主要代码:

 

至此,UDP网络编程完成。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值