博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
tcp eaddrnotavail
阅读量:4546 次
发布时间:2019-06-08

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

很久没来园子了,开年后一直忙于开发游戏的演示版本,今天发布了,一个值得庆祝的小日子:)给“码”年一个好的开局,也祝园子里的小伙伴们“码”年大吉,“码”上发大财,“码”出精彩!

 

游戏部署到阿里云服务器后,玩着玩着游戏桌子就会突然挂掉,查看日志发现错误{connection_error,eaddrnotavail}。我了个去,在深圳这么冷的春天给我和我的小伙伴们浇了一头冷水~~赶紧找虫子去,走查代码的走查代码,问古狗的古狗。。。在Erlang官网上发现:

POSIX Error Codes

  • e2big - argument list too long
  • eacces - permission denied
  • eaddrinuse - address already in use
  • eaddrnotavail - cannot assign requested address

 

在调用TCP connect时,Linux内核会在某个范围内选择一个可用的端口作为本地端口去connect服务器,如果没有可用的端口可用,比如这个范围内的端口都处于如下状态中的一种:

1. bind使用的端口
2. 端口处于非TIME_WAIT状态
3. 端口处于TIME_WAIT状态,但是没有启用tcp_tw_reuse
那么就会返回EADDRNOTAVAIL错误。

 

一般情况下,出现这个错误应该是代码设计的问题:

1、我们在使用redis后,没有调用eredis:stop(Conn),所以在一段时间后没有可用的端口。

2、也没有使用连接池。

 

 

如果确定代码没有问题,那么根据上面的原则,可用使用如下方法解决问题:

1. 增大可选端口的范围,修改/proc/sys/net/ipv4/ip_local_port_range的值。
2. 开启tcp_tw_reuse,允许使用TIME_WAIT状态的端口。

 

转载于:https://www.cnblogs.com/hongmao/p/3556391.html

你可能感兴趣的文章
项目Beta冲刺(团队3/7)
查看>>
PHP和MySQL应用实战(更新完毕)
查看>>
使用switchshow/supportshow命令确认Brocade交换机型号(转载)
查看>>
KMP字符串模式匹配学习笔记
查看>>
设计模式 - 装饰器模式(Decorator)
查看>>
在线工具地址
查看>>
Binary Tree Right Side View
查看>>
Windows中安装BeautifulSoup
查看>>
题目1:删除排序数组中的重复数字
查看>>
爱奇艺在文本舆情挖掘上的技术探索和实践
查看>>
动手动脑-5
查看>>
wire [7:0] regAddr; 理解
查看>>
云存储的那些事(1)——数据冗余
查看>>
android状态机机制StateMachine
查看>>
滚动条自适应宽度的问题
查看>>
第二次作业——个人项目实战
查看>>
HighCharts图表控件在ASP.NET WebForm中的使用
查看>>
C#汉字转拼音
查看>>
Remote Service 和 Local App的交互
查看>>
用python实现最长公共子序列算法(找到所有最长公共子串)
查看>>