`
┿┅мīSS
  • 浏览: 96024 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

(转)Erlang中粘包处理

 
阅读更多

转载自 http://www.qingliangcn.com/?s=%E7%B2%98%E5%8C%85

 

 

recv(ClientSockPacketLenOldRemain

  when is_integer(PacketLenOldand is_binary(Remain) ->

case gen_tcp:recv(ClientSock0of

{ok, B} ->

Bin = <<Remain/binary, B/binary>>,

%% read the packet length

if PacketLenOld =:= 0 andalso erlang:byte_size(Bin) > 2

 -> <<PacketLen:16Remain2/binary>> = Bin;

   true -> Remain2 = BinPacketLen = PacketLenOld

end,

?DEBUG("packet length ~p", [PacketLen]),

if 

erlang:byte_size(Remain2) >= PacketLen

  -> {RealDataNext} = split_binary(Remain2PacketLen),

 MainData = decode(RealData),

 {ok, MainData0Next};

true -> {continue, PacketLenRemain2}

end;

{error, closed} ->

?DEBUG("socket closed ~p ~n", [ClientSock]),

{error, closed};

{error, Reason} ->

?ERROR_MSG("socket closed ~p with reason: ~p ~n", [ClientSockReason]),

{error, Reason}

end.

翻了翻文档发现实际上在erlang中没有必要这样麻烦

The Length argument is only meaningful when the socket is in 

raw mode and denotes the number of bytes to read. 

If Length = 0, all available bytes are returned. 

If Length > 0, exactly Length bytes are returned, or an error;

recv(ClientSock) ->

case gen_tcp:recv(ClientSock2of

{ok, PacketLenBin} -> <<PacketLen:16>> = PacketLenBin,

case gen_tcp:recv(ClientSockPacketLenof

{ok, RealData} ->

?DEBUG("recv data ~p", [RealData]),

{ok, decode(RealData)};

{error, Reason} ->

?ERROR_MSG("read packet data failed with reason: ~p", [Reason]),

{error, Reason}

end;

{error, Reason} -> 

?ERROR_MSG("read packet length failed with reason: ~p", [Reason]),

{error, Reason}

end.

<!--EndFragment-->

 

分享到:
评论

相关推荐

    erlang中文基础教程

    2. **并发性**:Erlang中的进程是轻量级的,创建和销毁几乎无开销,且进程间通过消息传递通信,降低了共享状态的复杂性。 3. **热更新**:Erlang支持运行时修改和更新代码,无需停止系统服务,提高了系统的可维护性...

    Erlang并发编程,Erlang程序设计,Erlang中文手册

    Erlang并发编程,Erlang程序设计,Erlang中文手册。 学习erlang的好资料。  Erlang是一个结构化,动态类型编程语言,内建并行计算支持。最初是由爱立信专门为通信应用设计的,比如控制交换机或者变换协议等,因此...

    erlang 中文基础教程

    更复杂的数学运算也能轻松处理,比如`(42+77)*66/3.`,Erlang Shell能够正确解析并执行加、减、乘、除等运算,返回结果`2618.00`。这展示了Erlang语言强大的计算能力。 当需要退出Erlang Shell时,可以通过两种方式...

    erlang 中文乱码

    首先,我们需要理解Erlang中的字符编码。Erlang标准库默认使用Unicode(通常是UTF-8)作为其内部字符串表示。这意味着所有内部的文本数据都应该以UTF-8编码。然而,在与其他系统交互,如读取或写入文件时,如果编码...

    Erlang中文手册.pdf

    - **1.2.9 变量的匹配、守卫和作用域**:深入讲解Erlang中变量的行为和模式匹配。 - **1.2.10 更多关于列表**:讲解列表的高级特性。 - **1.2.11 If和Case**:解释条件语句的使用。 - **1.2.12 内建函数(BIFs)**:...

    erlang中dns解析

    以下是关于Erlang中DNS解析的一些核心知识点: 1. **inet** 模块:Erlang的标准库包含了`inet`模块,它提供了一系列的函数用于网络相关的操作,包括DNS查询。例如,`inet:gethostbyname/1,2`函数可以用来获取主机名...

    erlang 中文,chm参考文档

    4. **模式匹配**:Erlang中的模式匹配是其语法的一大特色,用于在函数定义中解构复杂的数据结构。 5. **错误处理**:讲解Erlang的异常处理机制,如try-catch-finally语句。 6. **模式和类型**:涵盖模式匹配和类型...

    使用erlang自带的处理日常的xml

    这个是平时工作中使用到的xml处理,使用的是erlang自带的方法加上自已的一个调整使用的,没找到可以选1分的地方

    erlang 中进程

    在Erlang中,进程是并发执行的基本单元,它们轻量级且独立,彼此通过消息传递进行通信。下面将详细介绍Erlang中的进程以及如何使用它们进行并发开发。 1. 进程概念 在Erlang中,进程不同于操作系统中的线程或进程。...

    erlang编程 Introducing Erlang

    Erlang中的链接(Linking)和监控(Monitoring)机制允许进程间建立关系,以便在另一进程崩溃时得到通知。链接用于追踪相关进程的状态,而监控则可以观察进程的生存状态。 ### 5. 消息传递 Erlang的进程间通信主要...

    erlang25.0 windows版本

    - **行为模式**:如GenServer、GenEvent和Gen_fsm,它们定义了Erlang中服务器、事件处理和状态机的通用行为。 - **Elixir**:基于Erlang VM的现代编程语言,提供了更接近Ruby的语法,同时保留了Erlang的并发特性和...

    Erlang 中的Module级别热部署

    本文将深入探讨Erlang中的模块级别热部署,并提供相关资源供进一步学习。 首先,理解Erlang的模块结构是必要的。在Erlang中,模块是代码的基本单元,包含函数定义和其他声明。当一个模块被加载到Erlang虚拟机(VM)...

    erlang_版本24.3.4.4

    - **错误处理**:Erlang采用异常处理机制,鼓励编写无副作用的纯函数,有助于编写容错性强的代码。 - **模式匹配**:Erlang的模式匹配功能允许在函数定义中使用模式来匹配和解构数据结构,简化了代码编写。 - **...

    在erlang项目中使用protobuf例子

    由于无法直接访问这个链接,我将基于protobuf在Erlang中的常见用法来解释相关知识点。 1. **protobuf安装与编译**:首先,你需要在Erlang项目中安装protobuf的Erlang库,这通常通过rebar3或erlang.mk等构建工具完成...

    erlang lib of iconv

    Erlang是一种并发性极强、适合构建分布式系统的动态类型语言,而iconv库则提供了在Erlang环境中处理字符串编码问题的能力。 首先,我们来了解一下字符编码的基本概念。字符编码是将字符与数字对应起来的方式,常见...

    Erlang游戏程序学习完整PDF手册

    5. **模式匹配**:Erlang的模式匹配功能使得数据处理更加简洁高效,对于游戏中的各种事件处理和状态转换非常适用。 6. **轻量级**:Erlang的虚拟机BEAM(Berkeley Packet Filter)设计精巧,占用资源少,适合在资源...

    <27>erlang record

    在Erlang中,Record提供了一种方便的方式来定义和访问具有固定字段的数据类型。 在Erlang中,Records是由一个特殊的语法创建的,形如`#record_name{field1 = value1, field2 = value2, ...}`。Record_name是记录的...

    xiandiao_erlang_Erlang课后习题_

    4. **错误处理与恢复**:习题可能设计为在遇到错误时,系统能优雅地处理并恢复,让学习者理解Erlang中的错误处理策略。 5. **模块化编程**:Erlang的模块系统可以帮助组织代码,习题可能要求学习者将功能分解到多个...

    Erlang官网下载过慢

    在IT行业中,Erlang因其强大的实时性和处理大量并发连接的能力而被广泛应用于电信、互联网基础设施和实时系统。RabbitMQ,一个基于Erlang开发的消息队列系统,是实现异步通信的关键组件。 标题中提到的“Erlang官网...

Global site tag (gtag.js) - Google Analytics