【原创】Erlang 的 gen_tcp:send 为什么没有 timeout 选项

在 gen_tcp 文档中有如下说明: 

The fact that the send call does not accept a timeout option, is because timeouts on send is handled through the socket optionsend_timeout. The behavior of a send operation with no receiver is in a very high degree defined by the underlying TCP stack, as well as the network infrastructure. If one wants to write code that handles a hanging receiver that might eventually cause the sender to hang on a send call, one writes code like the following.

大致意思为,sender 发送时没有 receiver 的情况,已经通过底层 TCP 协议栈很好的解决了,如果 sender 想使用带 timeout 功能的 send ,则需要在 connect 的时候指定 {send_timeout, xxx} 。 

假定的使用场景(取自 gen_tcp ): 

business process <--> client process(connect) <--> server process(accept) 

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

...

gen_tcp:connect(HostAddress, Port, [{active,false}, {send_timeout, 5000}, {packet,2}]),

loop(Sock),

...

 

In the loop where requests are handled, we can now detect send timeouts:

loop(Sock) ->

    receive

        %% 这里是来自 business 的消息发送命令

        {Client, send_data, Binary} ->

            case gen_tcp:send(Sock,[Binary]) of

                %% 这里完成针对 send 的超时处理

                {error, timeout} ->

                    io:format("Send timeout, closing!~n", []),

                    %% 可以针对超时做业务处理

                    handle_send_timeout(), % Not implemented here

                    Client ! {self(),{error_sending, timeout}},

                    %% Usually, it's a good idea to give up in case of a

                    %% send timeout, as you never know how much actually

                    %% reached the server, maybe only a packet header?!

                    %% 这里建议直接关闭

                    gen_tcp:close(Sock);

                {error, OtherSendError} ->

                    io:format("Some other error on socket (~p), closing",

                              [OtherSendError]),

                    Client ! {self(),{error_sending, OtherSendError}},

                    gen_tcp:close(Sock);

                ok ->

                    Client ! {self(), data_sent},

                    loop(Sock)

            end

    end.

      通常情况下,上述代码足以检测 receive 端的超时问题。大多数协议都会存在某种来自 server 端的确认机制,若存在,则不需要上述代码实现的 send 超时检测。需要使用的唯一场景是应用层协议是单向、无确认机制的情况。 

时间: 2024-10-22 05:25:50

【原创】Erlang 的 gen_tcp:send 为什么没有 timeout 选项的相关文章

【原创】导读”淘宝褚霸关于 gen_tcp 的分享“

本文纯粹作为学习淘宝褚霸关于 gen_tcp 所分享内容的摘录,方便记忆和后续翻阅.原文详细内容请移步 这里 .  ========= 我是美丽的分割线 ===========  0.< Erlang gen_tcp相关问题汇编索引 >  1.< Erlang版TCP服务器对抗攻击解决方案 > 本文列举了 TCP 服务器各种可能被攻击的情况,有网友给出了可能的解决办法.  2.< gen_tcp接受链接时enfile的问题分析及解决 >  知识点: a.确定 EMFIL

php实现与erlang的二进制通讯实例解析_php技巧

一般来说网络通讯常用的方式有2种:文本通讯和二进制通讯.php与erlang之间实现文本通讯比较简单,这里就不做讨论,本文主要讨论的是php与erlang实现二进制通讯的实现方法.实现步骤如下: erlang端代码: 复制代码 代码如下: -module(server). -export([start/0]). -define( UINT, 32/unsigned-little-integer). -define( INT, 32/signed-little-integer). -define(

【原创】Character Generator Protocol

===        Character Generator Protocol (CHARGEN) 是在 RFC 864 中由 Jon Postel 定义的 Internet Protocol Suite 中的一个服务.主要用于测试.调试,以及测量的目的.该协议很少被使用,因为其固有的设计缺陷容易导致误用和攻击.        任意 host 都可以通过 TCP 或 UDP 方式连接到支持 Character Generator Protocol 并启用了该服务的服务器上,默认端口号为 19.当

Erlang中的socket编程简单例子_Erlang

Erlang 中gen_tcp 用于编写TCP程序,gen_udp用于编写UDP程序.一个简单的TCP服务器echo示例: 复制代码 代码如下: Start_echo_server()->          {ok,Listen}= gen_tcp:listen(1234,[binary,{packet,4},{reuseaddr,true},{active,true}]),          {ok,socket}=get_tcp:accept(Listen),          gen_tc

Erlang实现的一个Web服务器代码实例_Erlang

转贴一个简单的Web服务器: httpd.erl %% httpd.erl - MicroHttpd -module(httpd). -author("ninhenry@gmail.com"). -export([start/0,start/1,start/2,process/2]). -import(regexp,[split/2]). -define(defPort,8888). -define(docRoot,"public"). start() ->

本函数计算两个时间的差[原创]

函数|原创 '******************************'||Function TimeDiff(sBegin, sEnd)'||本函数计算两个时间的差,可以不用更改直接使用'||作者:machinecat 2001/10/26'****************************** '******************************'注:首先需要判断用户输入的sBegin与sEnd之间的大小'可以通过DataDiff函数获得两者之间的时间差,不需要进行复杂的

简单的web server性能测试

    最近一直在读<java并发编程实践>,书是绝对的好书,翻译不能说差,也谈不上好,特别是第一部分的前面几章,有的地方翻译的南辕北辙了,还是要对照着英文版来看.我关注并发编程是从学习Erlang开始的,在多核来临的时代,有人说并发将是下一个10年的关键技术.java5之前的多线程编程很复杂,况且我也没有从事此类应用的开发,了解不多,而从jdk5引入了让人流口水的concurrent包之后,java的并发编程开始变的有趣起来.    书中第6章以编写一个web server为例子,引出了几种

使用ASP常见问题解答(转载)

解答|问题 正文: (作者:林子 2000年06月07日 14:12) 问题:如何保护自己的ASP源代码不泄露? 答:下载微软的Windows Script Encoder,对ASP的脚本和客户端JavaScript.VBScript脚本进行加密.客户端脚本加密后,只有IE5以上的版本才能执行,服务器端脚本加密后,只有服务器上安装有Script Engine 5(装IE5即可)才能解释执行. 问题:为什么Global.asa文件总是不起作用? 答:只有把Global.asa文件放在Web发布目录

spawn ssh

#! /usr/bin/expect set ip [lindex $argv 0]; set username [lindex $argv 1]; set password [lindex $argv 2]; set key_init "*yes/no*" set key_password "[Pp]assword:" set timeout 30 set prompt "(#|%|\\$) $" spawn ssh ${username}@$