Erlang中socket的“packet”选项怎么能如此加速tcp传输呢?

2024-03-09

使用{packet,4}通过本地主机上的两个不同端口传输1G数据只需要8秒,而使用{packet,raw}则无法在30秒内完成相同的任务。我知道如果使用后一种方法,数据将以数万个小块的形式到达(在archlinux上大小为1460字节)。我已经了解了 TCP/IP 协议的一些方面,并且已经思考这个问题好几天了,但仍然无法弄清楚确切的区别是什么。真诚地期待一些自下而上解释。

-module(test).

-export([main/1]).

-define(SOCKOPT, [binary,{active,true},{packet,4}]).

main(_) ->
    {ok, LSock} = gen_tcp:listen(6677, ?SOCKOPT),
    spawn(fun() -> send() end),
    recv(LSock).

recv(LSock) ->
    {ok, Sock} = gen_tcp:accept(LSock),
    inet:setopts(Sock, ?SOCKOPT),
    loop(Sock).

loop(Sock) ->
    receive
        {tcp, Sock, Data} ->
            io:fwrite("~p~n",[bit_size(Data)]),
            loop(Sock);
        {tcp_closed, Sock} -> ok
    end.

send() ->
    timer:sleep(500),
    {ok, Sock}=gen_tcp:connect("localhost", 6677, ?SOCKOPT),
    gen_tcp:send(Sock, binary:copy(<<"1">>, 1073741824)),
    gen_tcp:close(Sock).
$ time escript test.erl
8589934592
real 0m8.919s user 0m6.643s sys 0m2.257s

当你使用 {packet,4} erlang 首先读取 4 个字节来获取数据的长度,分配一个缓冲区来保存它,并在获取每个 tcp 数据包后将数据读入缓冲区。然后它将缓冲区作为一个数据包发送到您的进程。这一切都发生在内置读取代码中,速度相当快。

当你使用 {packet,raw} erlang 在收到每个 tcp 数据包后会向你的进程发送一条消息,因此对于每个 tcp 数据包它会做更多的事情。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Erlang中socket的“packet”选项怎么能如此加速tcp传输呢? 的相关文章

  • Erlang 参与者与 OOP 对象有何不同?

    假设我有一个 Erlang actor 定义如下 counter Num gt receive From increment gt From self new value Num 1 counter Num 1 end 同样 我有一个 Ru
  • Linux环境下串口数据转换为TCP/IP

    我需要从Linux系统的串口获取数据并将其转换为TCP IP发送到服务器 这很难做到吗 我有一些基本的编程经验 但对 Linux 的经验不多 有没有开源应用程序可以做到这一点 在 Linux 中您不需要编写程序来执行此操作 只是pipe h
  • 数据包丢失和数据包重复

    我试图找出数据包丢失和数据包重复问题之间的区别 有谁知道 数据包重复 是什么意思 和TCP检测到丢失时重传数据包一样吗 No In TCP 数据包 的传递是可靠的 我认为在这种情况下术语数据应该更好 因为它是面向流的协议 数据包丢失和重复是
  • 从 IPConfig 获取 IP 地址,稍后在代码中使用,或保存 [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 是否可以运
  • ZeroMQ可以用来接受传统的套接字请求吗?

    我正在尝试使用 ZeroMQ 重写我们的旧服务器之一 现在我有以下服务器设置 适用于 Zmq 请求 using var context ZmqContext Create using var server context CreateSoc
  • Erl 无法连接到本地 EPMD。为什么?

    Erlang R14B04 erts 5 8 5 source 64 bit rq 1 async threads 0 kernel poll false Eshell V5 8 5 abort with G root ip 10 101
  • AMQP如何克服直接使用TCP的困难?

    AMQP如何克服直接使用TCP发送消息时的困难 或者更具体地说 在发布 订阅场景中 在 AMQP 中 有一个代理 该代理接收消息 然后完成将消息路由到交换器和队列的困难部分 您还可以设置持久队列 即使客户端断开连接 也可以为客户端保存消息
  • 视频流上的 TCP 与 UDP

    我刚从网络编程考试回来 他们问我们的问题之一是 如果您要传输视频 您会使用 TCP 还是 UDP 请解释一下存储视频和实时视频流 对于这个问题 他们只是希望得到一个简短的答案 TCP 用于存储视频 UDP 用于实时视频 但我在回家的路上想到
  • 如何修改erlang中的记录?

    我需要修改操作记录中的值 place 和 other place op action walk from place to other place preconds at place me on floor me other place p
  • 是否可以找到哪个用户位于 localhost TCP 连接的另一端?

    这是一个编程问题 但它是 Linux Unix 特定的 如果我从本地主机获得 TCP 连接 是否有一种简单的方法可以告诉哪个用户在 C 程序内建立了连接而无需 shell 我知道这对于 Unix 域套接字来说并不太难 我已经知道远程 IP
  • Mnesia:如何同时锁定多行,以便我可以写入/读取一组“一致”的记录

    我多么希望我一开始就能表达我的问题 取一个包含 26 个键 a z 的表 并让它们具有整数值 创建一个流程 哎哟 一遍又一遍地做两件事 在一笔交易中 写入随机值a b and c使得这些值always总和为 10 在另一个事务中 读取值a
  • 简单的跨平台 TCP IP API?

    我不打算使用像 QT 或 wxWidgets 的 API 这样的大东西 我只想要可以在 Android iOS Windows Mac Linux 上运行的简单套接字 我正在制作一个事件驱动的纸牌游戏 所以 TCP 是最好的 本质上 我只想
  • 为什么 TCP 段中的 SYN 或 FIN 位会占用序列号空间中​​的一个字节?

    我试图理解这种设计背后的基本原理 我浏览了一些 RFC 但没有发现任何明显的东西 这并不是特别微妙 这样 SYN 和 FIN 位本身就可以被确认 因此如果丢失则可以重新发送 例如 如果连接关闭而没有发送更多数据 那么如果 FIN 没有发送任
  • 使用自定义 mysql 模式的模块扩展 ejabberd?

    代替ejabberd sql https github com processone ejabberd blob master sql mysql sql L95 我正在使用自定义 MySQL 架构 由于遗留原因 我将对某些活动执行一些数据
  • 使用netfilter队列修改数据包?

    我目前正在尝试在用户空间中使用带有 libnetfilter queue 的代码来修改在 iptables 的 NFQUEUE 目标中排队的数据包 但是我不知道如何去做 我已将其设置为使用 NFQNL COPY PACKET 复制数据包 如
  • Erlang 如何睡觉(晚上?)

    我想在 Erlang 服务器上每隔几个小时运行一次小型清理过程 我知道计时器模块 我在教程中看到一个示例 使用链式计时器 睡眠命令来等待几天后发生的事件 我觉得这很奇怪 我知道 Erlang 进程与其他语言中的进程相比是独一无二的 但是进程
  • 在 digraph_utils:is_acirclic/1 返回 false 后查找循环或循环

    我怎样才能 有效地 在Erlang有向图中找到循环或循环digraph utils is acyclic 1返回假 EDIT is acyclic is 定义为 https github com erlang otp blob maint
  • 当我使用“control-c”关闭发送对等方的套接字时,为什么接收对等方的套接字不断接收“”

    我是套接字编程的新手 我知道使用 control c 关闭套接字是一个坏习惯 但是为什么在我使用 control c 关闭发送进程后 接收方上的套接字不断接收 在 control c 退出进程后 发送方的套接字不应该关闭吗 谢谢 我知道使用
  • Erlang 中的接受器池和负载平衡?

    From http www erlang org doc man gen tcp html accept 1 http www erlang org doc man gen tcp html accept 1 值得注意的是 accept 调
  • Erlang 中的变量

    我有一个非常简单的 Erlang 程序 module test export start 0 Code Z00887 start gt io fwrite Code 我有以下两个错误 c erl6 1 dev test erl 4 之前的语

随机推荐

  • 如何在iPad中使用UIImagePickerController?

    您好 我正在开发一个通用应用程序 iPhone iPad 一个功能是我必须从相册中选择一张照片并将其显示在 UIImageView 上 现在的问题是它在 iPhone 上运行良好 但当我尝试打开相册时它崩溃了 我在操作表委托中的代码是这样的
  • 由于 MPI init 中止,mpiexec 失败

    我正在尝试安装MPICH http en wikipedia org wiki MPICH2 在运行 Ubuntu 11 04 Natty Narwhal 的 64 位机器上 我用了 sudo apt get install mpich2
  • 每次调用或打开页面时都会增加变量吗?

  • 如何使用 HTTPS 代理启动 VSCode chrome 调试器

    我之前曾在没有 SSL 代理的情况下从 VSCode 启动过 chrome 所以我猜这就是我问题的根源 这是我的 VSCode launch json 配置 name Launch Chrome request launch type pw
  • protege 中的自反属性

    This https ufile io rcv9m是我用 protege 5 创建的本体 如果我做cl1 and cl2不相交 那么本体是不一致的 但是如果我取消选中is friend of反身性的 本体论不再不一致 我的本体有什么问题吗
  • IIS7 应用程序请求路由 HTTPS

    我有一个反向代理 可将流量路由到我的应用程序服务器 我的公共网站有登录功能 通过 HTTPS 提供服务 SSL 证书仅安装在反向代理服务器中 我的应用服务器没有 SSL 证书 反向代理服务器中启用了 SSL 卸载 到目前为止效果很好 我可以
  • 如果 Task Runner Explorer 任务失败则取消构建

    我正在使用 Visual Studio 任务运行程序 2015 来运行绑定到构建之前的 Gulp 任务 我已经将其设置为当 gulp 任务失败时 它会发送退出代码 1 并在最后显示 进程以代码 1 终止 然而构建仍在继续 这将取消团队城市中
  • 如何在 Perforce 2013 之前将搁置的变更列表取消搁置到另一个分支?

    Using Perforce 服务器 2012 2 538478 如何将文件从主干取消搁置到另一个分支 当尝试这样做时 我得到 filename not mapped to your workspace view 在 Perforce 20
  • jdt.core Java 模型的 JUnit 测试

    我正在尝试为我的代码进行一些 JUnit 测试 但问题是 我使用了 ICompilationUnit IPackageFragment ITypes 等 Java 模型 我不知道如何创建一些 ICompilationUnit 然后进行测试
  • 如何在由空格分隔的字符串的中点添加换行符

    使用 php 如何在字符串相对中间的空白处插入换行符 或者换句话说 如何计算句子中的单词数 然后在句子的中间点换行 这个想法是为了避免博客文章标题第二行出现寡妇 废弃的单词 方法是将每个标题切成两半 如果标题占用一行以上 则将其放在两行上
  • C# 中反射的 SetValue

    考虑这段代码 var future new Future future GetType GetProperty info Name SetValue future converted 在上面的代码中 我们应该传递两个参数SetValue 首
  • SceneKit - 如何获取 .dae 模型的动画?

    好吧 我在这里使用 ARKit 和 SceneKit 我在查看其他涉及 SceneKit 试图在其中建立模型的问题时遇到了麻烦 dae格式化并加载各种动画以使该模型运行 现在我们在 iOS11 中似乎某些解决方案不起作用 这是我从基地获取模
  • Haskell 中是否执行单子法则?

    来自 Haskell 维基 Monad 可以被视为各种标准编程接口 数据或控制结构 由 Monad 类捕获 全部 常见的单子是它的成员 class Monad m where gt gt m a gt a gt m b gt m b gt
  • 如何处理Matlab parfor循环中的未分类变量?

    我有以下代码 我想使其并行 但不幸的是 当我使用 parfor 循环时 出现以下错误 这是代码 parfor l1 1 length lambda1 list over l1 for l2 1 length lambda2 list par
  • Chrome SVG 网络字体在选择输入中出现奇怪的字符

    Windows 8 上的 Chrome 26 0 1410 64m 在渲染 WebFonts 时出现问题 这是一个已知问题 解决方案是首先提供字体的 svg 版本而不是 woff 版本 它修复了抗锯齿并使字体看起来再次漂亮 此方法的缺点是选
  • Safari iOS 12.2 和 12.3 中的错误

    所以我刚才在做个人项目时注意到了一些奇怪的事情 以下代码将导致位置问题div如果手机在方向之间来回切换 则元素处于纵向模式 而不是div如果固定或与屏幕底部齐平 div 将漂浮在屏幕上方并且根本不接触屏幕底部 html width 100
  • Java 中的泛型和反射

    这可能是一个非常基本的问题 但我对 Java 中的泛型确实很陌生 而且我很难改变我的思维过程与 C 中的完成方式 所以请耐心等待 我正在尝试用 Java 构建一个通用存储库 我创建了一个 IRepository 界面 如下所示 public
  • 在asp.net中使用表单身份验证时,是否可以使用iis 7来管理用户

    我有一个使用表单身份验证的 ASP NET Web 应用程序 一切都已配置并正常工作 但是 我正在处理创建和维护用户和角色成员资格的问题 我知道我可以推出自己的解决方案 但我想知道是否有替代解决方案 iis7 是否提供用于管理表单身份验证用
  • 如何使用 WinAPI 锁定内存中的页面?

    我需要防止应用程序的内存页面在 Windows 上从 RAM 中换出 是否有与 POSIX 等效的 WinAPI 函数mlockall http opengroup org onlinepubs 007908799 xsh mlockall
  • Erlang中socket的“packet”选项怎么能如此加速tcp传输呢?

    使用 packet 4 通过本地主机上的两个不同端口传输1G数据只需要8秒 而使用 packet raw 则无法在30秒内完成相同的任务 我知道如果使用后一种方法 数据将以数万个小块的形式到达 在archlinux上大小为1460字节 我已