通常每个套接字地址只能使用一次_第五十三章、数据报套接字的发送接收

前面我们讲了流套接字的发送接收,这一章我们来学习下在数据报套接字上发送和接收数据。

由于底层协议的不同,数据报套接字是UDP协议,UDP是无连接、不可靠的数据报协议。

如图:

c03067c41875660bcfed315f0b6eb99e.png

在这种通信方式中,客户不与服务建立连接,它只是通过sendto向服务程序发送数据报,同时服务程序也不接收来自客户的连接,它只是调用recvfrom函数,这个函数等待来自某个客户的数据,并随接收到的数据报一起返回客户的地址,服务程序由此可以回应客户。使用数据报套接字,可以将数据集中为一个包,为每个包单独的指定目的地址,并且每个包独立的进行通信。

接下来我们来看下sendto和recvfrom函数的定义:

ssize_t sendto (int __fd, const void *__buf, size_t __n, int __flags, __CONST_SOCKADDR_ARG __addr, socklen_t __addr_len)

ssize_t recvfrom (int __fd, void *__restrict __buf, size_t __n, int __flags, __SOCKADDR_ARG __addr, socklen_t *__restrict __addr_len)

这两个函数的前三个参数和read和write函数的参数相同(有不清楚的可以看我前面第五十一章),对于recvfrom,如果所接收的包的实际长度大于参数n,则得到该包的前n个字节,而数据包的剩余部分被丢弃,无法在读到此数据包的剩余部分,因此,当采用数据报协议时,必须总是知道数据包的预期长度。

参数flags和send和recv函数中的flags相同(可以看我第五十二章)。

recvfrom的参数addr和addr_len,在函数返回时,他们给出套接字地址结构告诉是谁发送的数据报。如果不想知道这个信息,可以指定addr和addr_len为空指针。

sendto的最后两个参数类似于connect,当发送数据报时,要在此套接字地址结构中填入协议地址以指明数据报发送给谁。

注意:sendto的最后一个参数是整型值,recvfrom的最后一个参数是指向整数的指针。

我们来看下程序:

客户端:

12eefaac0311d8b851e17c22343c4649.png

服务端:

db2cd84f81391b6d1e5cb9bf38b4135c.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值