转载自 http://www.qingliangcn.com/?s=%E7%B2%98%E5%8C%85
recv(ClientSock, PacketLenOld, Remain)
when is_integer(PacketLenOld) and is_binary(Remain) ->
case gen_tcp:recv(ClientSock, 0) of
{ok, B} ->
Bin = <<Remain/binary, B/binary>>,
%% read the packet length
if PacketLenOld =:= 0 andalso erlang:byte_size(Bin) > 2
-> <<PacketLen:16, Remain2/binary>> = Bin;
true -> Remain2 = Bin, PacketLen = PacketLenOld
end,
?DEBUG("packet length ~p", [PacketLen]),
if
erlang:byte_size(Remain2) >= PacketLen
-> {RealData, Next} = split_binary(Remain2, PacketLen),
MainData = decode(RealData),
{ok, MainData, 0, Next};
true -> {continue, PacketLen, Remain2}
end;
{error, closed} ->
?DEBUG("socket closed ~p ~n", [ClientSock]),
{error, closed};
{error, Reason} ->
?ERROR_MSG("socket closed ~p with reason: ~p ~n", [ClientSock, Reason]),
{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(ClientSock, 2) of
{ok, PacketLenBin} -> <<PacketLen:16>> = PacketLenBin,
case gen_tcp:recv(ClientSock, PacketLen) of
{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-->
分享到:
相关推荐
2. **并发性**:Erlang中的进程是轻量级的,创建和销毁几乎无开销,且进程间通过消息传递通信,降低了共享状态的复杂性。 3. **热更新**:Erlang支持运行时修改和更新代码,无需停止系统服务,提高了系统的可维护性...
Erlang并发编程,Erlang程序设计,Erlang中文手册。 学习erlang的好资料。 Erlang是一个结构化,动态类型编程语言,内建并行计算支持。最初是由爱立信专门为通信应用设计的,比如控制交换机或者变换协议等,因此...
更复杂的数学运算也能轻松处理,比如`(42+77)*66/3.`,Erlang Shell能够正确解析并执行加、减、乘、除等运算,返回结果`2618.00`。这展示了Erlang语言强大的计算能力。 当需要退出Erlang Shell时,可以通过两种方式...
首先,我们需要理解Erlang中的字符编码。Erlang标准库默认使用Unicode(通常是UTF-8)作为其内部字符串表示。这意味着所有内部的文本数据都应该以UTF-8编码。然而,在与其他系统交互,如读取或写入文件时,如果编码...
- **1.2.9 变量的匹配、守卫和作用域**:深入讲解Erlang中变量的行为和模式匹配。 - **1.2.10 更多关于列表**:讲解列表的高级特性。 - **1.2.11 If和Case**:解释条件语句的使用。 - **1.2.12 内建函数(BIFs)**:...
以下是关于Erlang中DNS解析的一些核心知识点: 1. **inet** 模块:Erlang的标准库包含了`inet`模块,它提供了一系列的函数用于网络相关的操作,包括DNS查询。例如,`inet:gethostbyname/1,2`函数可以用来获取主机名...
4. **模式匹配**:Erlang中的模式匹配是其语法的一大特色,用于在函数定义中解构复杂的数据结构。 5. **错误处理**:讲解Erlang的异常处理机制,如try-catch-finally语句。 6. **模式和类型**:涵盖模式匹配和类型...
这个是平时工作中使用到的xml处理,使用的是erlang自带的方法加上自已的一个调整使用的,没找到可以选1分的地方
在Erlang中,进程是并发执行的基本单元,它们轻量级且独立,彼此通过消息传递进行通信。下面将详细介绍Erlang中的进程以及如何使用它们进行并发开发。 1. 进程概念 在Erlang中,进程不同于操作系统中的线程或进程。...
Erlang中的链接(Linking)和监控(Monitoring)机制允许进程间建立关系,以便在另一进程崩溃时得到通知。链接用于追踪相关进程的状态,而监控则可以观察进程的生存状态。 ### 5. 消息传递 Erlang的进程间通信主要...
- **行为模式**:如GenServer、GenEvent和Gen_fsm,它们定义了Erlang中服务器、事件处理和状态机的通用行为。 - **Elixir**:基于Erlang VM的现代编程语言,提供了更接近Ruby的语法,同时保留了Erlang的并发特性和...
本文将深入探讨Erlang中的模块级别热部署,并提供相关资源供进一步学习。 首先,理解Erlang的模块结构是必要的。在Erlang中,模块是代码的基本单元,包含函数定义和其他声明。当一个模块被加载到Erlang虚拟机(VM)...
- **错误处理**:Erlang采用异常处理机制,鼓励编写无副作用的纯函数,有助于编写容错性强的代码。 - **模式匹配**:Erlang的模式匹配功能允许在函数定义中使用模式来匹配和解构数据结构,简化了代码编写。 - **...
由于无法直接访问这个链接,我将基于protobuf在Erlang中的常见用法来解释相关知识点。 1. **protobuf安装与编译**:首先,你需要在Erlang项目中安装protobuf的Erlang库,这通常通过rebar3或erlang.mk等构建工具完成...
Erlang是一种并发性极强、适合构建分布式系统的动态类型语言,而iconv库则提供了在Erlang环境中处理字符串编码问题的能力。 首先,我们来了解一下字符编码的基本概念。字符编码是将字符与数字对应起来的方式,常见...
5. **模式匹配**:Erlang的模式匹配功能使得数据处理更加简洁高效,对于游戏中的各种事件处理和状态转换非常适用。 6. **轻量级**:Erlang的虚拟机BEAM(Berkeley Packet Filter)设计精巧,占用资源少,适合在资源...
在Erlang中,Record提供了一种方便的方式来定义和访问具有固定字段的数据类型。 在Erlang中,Records是由一个特殊的语法创建的,形如`#record_name{field1 = value1, field2 = value2, ...}`。Record_name是记录的...
4. **错误处理与恢复**:习题可能设计为在遇到错误时,系统能优雅地处理并恢复,让学习者理解Erlang中的错误处理策略。 5. **模块化编程**:Erlang的模块系统可以帮助组织代码,习题可能要求学习者将功能分解到多个...
在IT行业中,Erlang因其强大的实时性和处理大量并发连接的能力而被广泛应用于电信、互联网基础设施和实时系统。RabbitMQ,一个基于Erlang开发的消息队列系统,是实现异步通信的关键组件。 标题中提到的“Erlang官网...