博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【原创】Erlang 的 gen_tcp:send 为什么没有 timeout 选项
阅读量:6373 次
发布时间:2019-06-23

本文共 1797 字,大约阅读时间需要 5 分钟。

在 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} 。
 


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


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 超时检测。需要使用的唯一场景是应用层协议是单向、无确认机制的情况。
 

转载地址:http://vjfqa.baihongyu.com/

你可能感兴趣的文章
Java异常
查看>>
map、reduce、filter、for...of、for...in等总结
查看>>
html2canvas-实现页面截图
查看>>
入门 | 从文本处理到自动驾驶:机器学习最常用的50大免费数据集
查看>>
笔记-从源码角度分析alloc与init的底层
查看>>
消除GitHub上的历史记录
查看>>
自学 JAVA 的几点建议
查看>>
第十三天-企业应用架构模式-对象-关系元数据映射模式
查看>>
k8s与HPA--通过 Prometheus adaptor 来自定义监控指标
查看>>
虎牙直播在微服务改造方面的实践和总结
查看>>
怎样将优酷网站下载的视频KUX转MP4格式
查看>>
MongoDB 分组统计
查看>>
二进制状态码
查看>>
Vue 中 CSS 动画原理
查看>>
关于 Promise 的 9 个提示
查看>>
算法复习
查看>>
安卓中高级开发面试知识点之——缓存
查看>>
Java的初始化顺序
查看>>
js 判断回文字符串
查看>>
shields小徽章是如何生成的?以及搭建自己的shield服务器
查看>>