当前位置: 首页 > news >正文

ERLANG 网工修炼笔记 ---- UDP

UDP是一个比较常用的传输层协议,erlang标准库中提供了 gen_dup 模块,要掌握UDP协议,我们首先要熟悉这个模块。

函数

首先看这个模块的几个公共函数:

  • open <> close
  • send <> recv
  • connect
  • controlling_process
  • fdopen

open 和 close 比较好理解,就是在某个端口上打开一个socket,以及关闭某个socket。

send 就是通过某个socket,往某个地址的某个端口发送packet。recv 就是接受某个socket中一定长度的数据。

connect 就有点奇怪了,我们知道UDP协议是无连接的。事实上这个函数并没有文档,不是暴露给普通用户使用的。

controlling_process 是为某个socket赋予一个新的归属进程。在erlang里,有很多的进程,他们之间相互传递消息来通信,socket从外界接收到的消息,自然也要先传递到某个进程里,才可以进入erlang的世界。归属进程的作用就是接收socket的消息。

fdopen 这个函数也没有文档,作用是从某个文件描述符来打开一个socket。

选项

open ,也就是打开一个socket的时候需要传入Option设置,有下列选项:

  • list | binary | {mode, list | binary} 以列表还是字符串的形式接收Packet。
  • {ip, Address} 当host有多个网络接口的时候,选择其中一个。
  • {ifaddr, Address} 和 {ip, Address} 一样的。
  • {fd, integer() >= 0} 如果有socket不是使用 gen_udp 来打开的,那么就可能需要设置一个文件描述符。
  • inet6 | inet | local 设置socket的类型。
  • {udp_module, module()} 覆盖默认的udp模块。
  • {multicast_if, Address} 为多播socket设置本地设备。
  • {multicast_loop, true | false} 为真时,多播的packets会循环地返回到本地socket。
  • {multicast_ttl, Integer} 多播的TTL,默认是1.
  • {add_membership, {MultiAddress, InterfaceAddress}} 加入多播群。
  • {drop_membership, {MultiAddress, InterfaceAddress}} 离开多播群。
  • {active, true | false | once | N} 如果为真,socket收到的所有消息会发送到归属进程。如果为假,就需要显式调用recv;once 是收到消息后,就会发送到进程,但会变为false。数值是指接收多少条数据。
  • {buffer, Size} 用户层级的缓冲区大小。
  • {delay_send, Boolean} 通常erlang会立刻发出给socket的消息,开启这个选项后,会等待一会儿然后集合发出。
  • {deliver, port | term} 发送给归属进程的消息的格式。
  • {dontroute, Boolean} 对于发出的消息是否采用路由。
  • {exit_on_close, Bloolean} socket 关闭时退出归属进程。
  • {header, Size} 只有当binary起作用时才有用,单位是byte。

选项太多了,下列的在之后有用到的话再来解释:

  • {high_msgq_watermark, Size}
  • {ipv6_v6only, Boolean}
  • {linger, {true | false, Seconds}}
  • {low_msgq_watermark, Size}
  • {netns, Namespace :: file:filename_all()}
  • {bind_to_device, Ifname :: binary()}
  • {raw, Protocol, OptionNum, ValueBin}
  • {read_packets, Integer}
  • {recbuf, Size}
  • {recvtclass, Boolean}
  • {recvtos, Boolean}
  • {recvttl, Boolean}
  • {reuseaddr, Boolean}
  • {send_timeout, Integer}
  • {send_timeout_close, Boolean}
  • {sndbuf, Size}
  • {priority, Integer}
  • {tos, Integer}
  • {tclass, Integer}

结构

clipboard.png

这是erlang和外界通信的大致结构,通过erlang_port来调用系统的API。

实验

我们尝试使用udp通过ipv4来查询DNS信息。

  1. 在任意端口打开一个udp的socket
{ok, Socket} = gen_udp:open(0, [{active, false}, binary, inet]).
  1. 使用inet_db:res_option/1读取所需要的一些配置信息:
#{alt_nameservers=[], edns=false, inet6=false, nameservers=[{{127,0,0,53},53}], inet6=false, retry=3, timeout=2000, udp_payload_size=1280, usevc=false}
  1. dns_rec record 来包装信息,并使用inet_dns:encode/1来编码。这里我们构造了一个Msg。
Msg=#dns_rec{header=#dns_header{id=999, 
                      opcode='query',
                      rd=false,
                      rcode=0},
            qdlist=[#dns_query{domain="google.com", 
                       type=a, 
                       class=in}],
           arlist=[]}.
Buffer=inet_dns:encode(Msg).

相关文章:

  • 10.Spring入门笔记
  • css 单选按钮图标替换
  • CF724E Goods transportation
  • Binomial Coefficient(二项式系数)
  • 桂余丢证
  • 记2018年的最后一个bug
  • 算法踩坑小记
  • 洛谷P3674 小清新人渣的本愿
  • 我们是如何从ng1迁移ing到vue的
  • linux设置动态库路径和环境变量
  • 小细节见实力,告诉你vivo Z3如何成为爆款千元机
  • 8分钟学会Consul集群搭建及微服务概念
  • 2019年Java和JVM生态系统预测:OpenJDK将成为Java运行时市场领导者
  • 天海实业携手海宇勇创签署战略合作协议
  • 机器学习可行性与VC dimension
  • JavaScript 如何正确处理 Unicode 编码问题!
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • AHK 中 = 和 == 等比较运算符的用法
  • const let
  • Flex布局到底解决了什么问题
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • JavaScript服务器推送技术之 WebSocket
  • java概述
  • maya建模与骨骼动画快速实现人工鱼
  • Python利用正则抓取网页内容保存到本地
  • Wamp集成环境 添加PHP的新版本
  • 测试如何在敏捷团队中工作?
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 微信小程序填坑清单
  • 小李飞刀:SQL题目刷起来!
  • 新版博客前端前瞻
  • 一、python与pycharm的安装
  • C# - 为值类型重定义相等性
  • $.ajax()参数及用法
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (1)(1.13) SiK无线电高级配置(六)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (算法二)滑动窗口
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .Family_物联网
  • .NET 服务 ServiceController
  • .Net多线程总结
  • .net开发引用程序集提示没有强名称的解决办法
  • .NET中统一的存储过程调用方法(收藏)
  • .考试倒计时43天!来提分啦!
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • [AIGC codze] Kafka 的 rebalance 机制
  • [C#]winform利用seetaface6实现C#人脸检测活体检测口罩检测年龄预测性别判断眼睛状态检测
  • [C#]科学计数法(scientific notation)显示为正常数字