UDP套接字编程

UDP套接字编程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jb3h9pYw-1623143489825)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210608110650766.png)]

recvfrom和sendto函数

#include <sys/socket.h>
//前三个参数等同于read和write函数的三个参数:描述符,指向读入或写出缓冲区的指针和读写字节数
//from指向一个数据报发送者的协议地址
ssize_t recvfrom(int sockfd, void *buff, size_t nbytes, int flags,
                  struct sockaddr *from, socklen_t *addrlen);
//to指向一个含有数据报接受者的协议地址(IP地址和端口号)
ssize_t sendto(int sockfd, const void *buff, size_t nbytes, int flags,
               const struct sockaddr *to, socklen_t addrlen);

验证收到的响应

如果服务器主机是多宿的,发送回应的时候的ip可能与客户端发送时的ip地址不一致。

解决方法:得到由recvfrom返回的ip地址后,客户通过DNS中查找服务器主机的名字来验证该主机的域名。

解决方法:UDP服务器给服务器主机配置的每个IP地址创建一个套接字,用bind捆绑每个IP地址到各自的套接字,然后在所有这些套接字上使用select,再从可读的套接字给出应答。

服务进程未运行

对一个UDP套接字,由它引发的异步错误却并不返回给它,除非它已连接。

仅在进程已将UDP套接字连接到恰恰一个对端后,这些异步错误才返回给进程。

UDP端口号

udp客户的ip可以随着发送的每个UDP数据报而变动。

UDP套接字目的IP地址只能通过IPv4设置IP_RECVDSTADDR套接字选项,或IPv6设置IPV6_PKTINFO套接字,然后调用recvmsg取得。

UDP的connect函数

与TCP不同:没有三次握手。

内核只是检查是否存在立即可知的错误,记录对端的IP地址和端口号,然后立即返回到调用进程。

  • 未连接UDP套接字,新创建UDP套接字
  • 已连接UDP套接字,对UDP套接字调用connect的结果

对已经连接的套接字,不能用sendto,改用write和send。

不必使用recvfrom来知道数据报发送者,改用read,recv或recvmsg。限制了一个已连接UDP套接字仅能与一个对端交换数据报。

已连接UDP套接字引发的异步错误会返回给他们所在的进程,未连接UDP套接字不接受任何异步错误。
在这里插入图片描述

给一个UDP套接字多次调用connect

  • 指定新的IP地址和端口号

  • 断开套接字
    未连接的UDP套接字上给两个数据报调用sendto函数涉及六个步骤

  • 连接套接字

  • 输出第一个数据报

  • 断开套接字连接

  • 连接套接字

  • 输出第二个数据报

  • 断开套接字连接

用connect后调用两次write涉及步骤

  • 连接套接字
  • 输出第一个数据报
  • 输出第二个数据报
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值