`
wenjixiao
  • 浏览: 193861 次
社区版块
存档分类
最新评论

lib_chan 简化版

    博客分类:
  • tech
阅读更多
我觉得那个lib_chan太烦,用法我也觉得不那么清晰,反正我不喜欢。
我把它改了改,其实完全不一样,就是中间人的协议类似。
这样我觉得用起来舒服些。

-module(mm).
-compile(export_all).

client_start(Address,Port,Pid) ->
	spawn(fun() ->connect(Address,Port,Pid) end).
	
connect(Address,Port,Pid) ->
	{ok,Socket}=gen_tcp:connect(Address,Port,[binary,{packet,4}]),
	loop(Socket,Pid).
	
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

server_start(Port,Pid) ->
	spawn(fun() ->start_parallel_server(Port,Pid) end),
	ok.

start_parallel_server(Port,Pid) ->
	link(Pid), %% Pid死的时候,listen也得死
	{ok,Listen}=gen_tcp:listen(Port,[binary,{reuseaddr,true},{packet,4},{active,true}]),
	spawn(fun()->par_connect(Listen,Pid) end),
	%% just waiting
	receive
	after infinity ->
		true
	end.
	
par_connect(Listen,Pid) ->
	case gen_tcp:accept(Listen) of
		{ok,Socket} ->
			spawn(fun()->par_connect(Listen,Pid) end),%% 启动一个新进程来accept连接,当前进程处理接受的socket
			link(Pid), %% Pid死的时候,mm也得死(当前进程变成了mm)
			loop(Socket,Pid);
		{error,closed} ->
			io:format("Listenning accept socket error,and was closed!~n")
	end.
	
loop(Socket,Pid) ->
	receive
		{tcp,Socket,Data} ->
			Term=binary_to_term(Data),
			Pid ! {mm,self(),Term},
			loop(Socket,Pid);
		{tcp_closed,Socket} ->
			Pid !{mm_closed,self()};
		{send,Term} ->
			gen_tcp:send(Socket,term_to_binary(Term)),
			loop(Socket,Pid);
		close -> %% when client or server exit,use it,gen a tcp_closed at another point
			gen_tcp:close(Socket)
	end.
0
0
分享到:
评论

相关推荐

    lib_mysqludf_sys 的win版本dll库

    "lib_mysqludf_sys 的win版本dll库"这一标题明确指出,我们正在讨论的是一个专为Windows操作系统设计的动态链接库(Dynamic Link Library, DLL)文件,名为lib_mysqludf_sys。DLL是Windows系统中用于封装可重用代码...

    stm32f10x标准固件库的帮助文档(stm32f10x_stdperiph_lib_um.chm)

    stm32f10x标准固件库的帮助文档(stm32f10x_stdperiph_lib_um.chm) stm32f10x标准固件库的帮助文档(stm32f10x_stdperiph_lib_um.chm) stm32f10x标准固件库的帮助文档(stm32f10x_stdperiph_lib_um.chm) stm32f10...

    lib_mysqludf_sys

    《MySQL系统命令UDF——lib_mysqludf_sys详解》 MySQL是一种广泛使用的开源关系型数据库管理系统,其功能强大,灵活性高。在实际应用中,有时我们需要执行一些操作系统级别的任务,如读取或写入文件、执行系统命令...

    流量累积功能块FB_函数库_Totalizer_Lib_TIA_Portal_V15版本.rar

    总的来说,"流量累积功能块FB_函数库_Totalizer_Lib_TIA_Portal_V15版本"是一个强大的工具,它简化了工业流量控制系统的开发过程,提升了自动化系统的性能,对于从事自动化工程的工程师来说,是提高效率和精度的有效...

    STM32F10x_StdPeriph_Lib_V3.5.0.zip

    STM32多种外设的开发例程:路径STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\ADC STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\BKP STM32F10x_StdPeriph_Lib_V...

    murata_lib_ads_s_2106.zip

    标题 "murata_lib_ads_s_2106.zip" 提供的信息表明,这是一个与村田(Murata)元器件相关的库文件,适用于ADS2016。ADS是Analog Device Studio的简称,是一款广泛用于射频(RF)、微波以及毫米波电路设计的仿真软件...

    STM32F10x_StdPeriph_Lib_V3.5.0中文版和英文版都有,史上最全

    STM32F10x_StdPeriph_Lib_V3.5.0是一个针对STM32F10x系列微控制器的官方标准外设库,它提供了丰富的API(应用程序编程接口)函数,使得开发者能够轻松地访问和控制STM32芯片的各种外围设备。STM32是由意法半导体...

    可用于博途TIA V17运动库文件 Drive_Lib_S7_1200_1500_TIA V17

    在TIA V17版本中,西门子提供了一套强大的运动控制库——Drive_Lib_S7_1200_1500_TIA V17,专为S7-1200和S7-1500系列PLC设计,旨在简化运动控制系统的编程和优化性能。 首先,我们要理解“运动库文件”的概念。运动...

    stm32f10x_stdperiph_lib_um_汉化.rar

    汉化版的用户手册(STM32F10x_stdperiph_lib_um_汉化.chm)是为了方便中国开发者阅读和理解而制作的,它将原始的英文文档翻译成了中文,消除了语言障碍,提高了开发效率。 STM32F10X系列是基于ARM Cortex-M3内核的...

    STM32F10x_StdPeriph_Lib_V3.5.0

    总之,STM32F10x_StdPeriph_Lib_V3.5.0是一个强大的工具,为基于Cortex-M3的STM32F10x微控制器开发提供了便利,简化了硬件驱动的编写工作,使开发者能更专注于应用程序的设计。通过深入理解并熟练运用这个库,可以...

    STM8S_StdPeriph_Lib_V2.1.0

    STM8S_StdPeriph_Lib_V2.1.0 提供的库简化了与这些外设的交互,使得开发者可以更专注于应用程序的逻辑,而不是底层硬件细节。 1. GPIO(通用输入/输出):GPIO是微控制器与外界进行数据交换的基础,STM8S库中的GPIO...

    STM32F10x_StdPeriph_Lib_V3.5.0官方库文件

    总的来说,STM32F10x_StdPeriph_Lib_V3.5.0为STM32F1系列微控制器提供了一套完整的软硬件接口,简化了开发者的工作,提高了开发效率,同时也保证了代码的稳定性和可移植性。无论你是初学者还是经验丰富的开发者,这...

    STM32F10x_StdPeriph_Lib_V3.5.0.rar_LIB_TIM_STM32F LIB_Void_ The_

    ADC examples 3 & 4 updated DEBUG example Example modified to support RIDE specific printf function implementation I2C example5 i2c_ee.c: add the following function prototypes: "...

    79047707_LSim_LIB_V3_0_0.zip

    为解决这一问题,我们有了一款名为“79047707_LSim_LIB_V3_0_0”的压缩包文件,它提供了一个专门用于仿真PID控制中PV值反馈的库。 首先,我们要理解什么是LSim LIB。LSim LIB是一个仿真库,专为PLC编程和仿真环境...

    stm32f4xx_dsp_stdperiph_lib_um.chm

    stm32f4xx_dsp_stdperiph_lib_um.chm

    stm32f10x_stdperiph_lib_um中英文版本

    STM32F10X标准外设库是STMicroelectronics为他们的Cortex-M3内核微控制器系列,特别是STM32F10X系列...同时,配合英文版和中文版的手册,无论是初学者还是经验丰富的工程师,都能找到所需的信息,进行STM32的项目开发。

    stm32f4xx_dsp_stdperiph_lib_um

    《STM32F4xx_DSP_StdPeriph_Lib_um》用户手册详细介绍了这些库的使用方法、示例代码和API函数的参数解释,是开发STM32F4系列产品的必备参考资料。通过学习和掌握这个库,开发者可以快速搭建应用系统,提高开发效率,...

    STM32L1xx_StdPeriph_Lib_V1.2.

    STM32L1xx_StdPeriph_Lib_V1.2.0是这个标准库的版本1.2.0更新,通常包含以下组件: 1. **头文件**:包含了所有外设的结构体定义、枚举类型、宏定义以及函数原型声明。这些头文件使得用户能方便地在代码中调用相应的...

    【固件库】STM32F10x_StdPeriph_Lib_V3.5.0

    STM32F10x_StdPeriph_Lib_V3.5.0是一个针对STM32F10x系列微控制器的固件库,由意法半导体(STMicroelectronics)开发,用于简化基于ARM Cortex-M3内核的STM32单片机的软件开发。这个库包含了标准外设驱动,使得...

Global site tag (gtag.js) - Google Analytics