我觉得那个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.
分享到:
相关推荐
"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) stm32f10...
总的来说,"流量累积功能块FB_函数库_Totalizer_Lib_TIA_Portal_V15版本"是一个强大的工具,它简化了工业流量控制系统的开发过程,提升了自动化系统的性能,对于从事自动化工程的工程师来说,是提高效率和精度的有效...
《MySQL系统命令UDF——lib_mysqludf_sys详解》 MySQL是一种广泛使用的开源关系型数据库管理系统,其功能强大,灵活性高。在实际应用中,有时我们需要执行一些操作系统级别的任务,如读取或写入文件、执行系统命令...
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)元器件相关的库文件,适用于ADS2016。ADS是Analog Device Studio的简称,是一款广泛用于射频(RF)、微波以及毫米波电路设计的仿真软件...
STM32F10x_StdPeriph_Lib_V3.5.0是一个针对STM32F10x系列微控制器的官方标准外设库,它提供了丰富的API(应用程序编程接口)函数,使得开发者能够轻松地访问和控制STM32芯片的各种外围设备。STM32是由意法半导体...
汉化版的用户手册(STM32F10x_stdperiph_lib_um_汉化.chm)是为了方便中国开发者阅读和理解而制作的,它将原始的英文文档翻译成了中文,消除了语言障碍,提高了开发效率。 STM32F10X系列是基于ARM Cortex-M3内核的...
在TIA V17版本中,西门子提供了一套强大的运动控制库——Drive_Lib_S7_1200_1500_TIA V17,专为S7-1200和S7-1500系列PLC设计,旨在简化运动控制系统的编程和优化性能。 首先,我们要理解“运动库文件”的概念。运动...
总之,STM32F10x_StdPeriph_Lib_V3.5.0是一个强大的工具,为基于Cortex-M3的STM32F10x微控制器开发提供了便利,简化了硬件驱动的编写工作,使开发者能更专注于应用程序的设计。通过深入理解并熟练运用这个库,可以...
总的来说,STM32F10x_StdPeriph_Lib_V3.5.0为STM32F1系列微控制器提供了一套完整的软硬件接口,简化了开发者的工作,提高了开发效率,同时也保证了代码的稳定性和可移植性。无论你是初学者还是经验丰富的开发者,这...
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”的压缩包文件,它提供了一个专门用于仿真PID控制中PV值反馈的库。 首先,我们要理解什么是LSim LIB。LSim LIB是一个仿真库,专为PLC编程和仿真环境...
stm32f4xx_dsp_stdperiph_lib_um.chm
STM32F10X标准外设库是STMicroelectronics为他们的Cortex-M3内核微控制器系列,特别是STM32F10X系列...同时,配合英文版和中文版的手册,无论是初学者还是经验丰富的工程师,都能找到所需的信息,进行STM32的项目开发。
STM8S_StdPeriph_Lib_V2.1.0 提供的库简化了与这些外设的交互,使得开发者可以更专注于应用程序的逻辑,而不是底层硬件细节。 1. GPIO(通用输入/输出):GPIO是微控制器与外界进行数据交换的基础,STM8S库中的GPIO...
《STM32F4xx_DSP_StdPeriph_Lib_um》用户手册详细介绍了这些库的使用方法、示例代码和API函数的参数解释,是开发STM32F4系列产品的必备参考资料。通过学习和掌握这个库,开发者可以快速搭建应用系统,提高开发效率,...
STM32L1xx_StdPeriph_Lib_V1.2.0是这个标准库的版本1.2.0更新,通常包含以下组件: 1. **头文件**:包含了所有外设的结构体定义、枚举类型、宏定义以及函数原型声明。这些头文件使得用户能方便地在代码中调用相应的...
STM32F10x_StdPeriph_Lib_V3.5.0是一个针对STM32F10x系列微控制器的固件库,由意法半导体(STMicroelectronics)开发,用于简化基于ARM Cortex-M3内核的STM32单片机的软件开发。这个库包含了标准外设驱动,使得...