IPv4地址集中有两个特殊地址:0.0.0和127.0.0.1。你知道他们的目的吗?输入netstat-ano来查找标有LISTEN的前几行,这表示本地系统打开了TCP4服务。通稿显示,38127、111、37681等地方端口已经开通。这些端口可以从外部访问吗?为什么有的端口前面是0.0.0.0,有的是127.0.0.1?
如果你能轻松回答以上问题,说明你已经不是网络基础小白了,可以跳过这篇文章,但是如果你不能,我想下面的工程实践可以给你解释清楚。另外你还能学到我的排查思路.
0.0.0.0被称为任意地址.如果一个以太网设备中有多个物理网卡,则意味着只要在本地打开相应的端口服务,无论哪个网卡发起连接请求都是允许的。如果你想限制一个服务只允许外部设备从指定的网卡入口发起访问,就把它配置成特定网卡的IP地址,如稿件插图中箭头那一行所示。端口8081只允许从IP地址为192.168.2.3的网卡入口发起。
写IPv4TCP应用的时候,把地址和端口绑定起来,形成一个服务。下面的文本显示INADDR_ANY参数是最常用的,bind & quot任何地址& quot。本文接下来内容讲述,当绑定地址非INADDR_ANY时会引起什么现象、以及如何排查和解决.
在ARM平台上编译完mosquitto之后,我当然会在ARM上测试一个服务是否正常,显然是成功的。同样,我把测试程序复制到其他主机上运行,客户端提示无法连接,服务器界面也没有打印异常信息。嵌入式工程师祖传DNA回应:“Itworkonmymachine”.首先两端执行ping命令检查网络连接状态,排除防火墙和路由表的配置,没有发现明显异常。
然后我决定在服务器上再测试一次,只是这次我换了本地网卡的地址。
//# define host ' localhost '/# define host ' 127 . 0 . 0 . 1 ' # define host ' 192 . 168 . 81 . 198 '哎~我还提示Unabletoconnect。我已经见过你很久了。是因为自己访问自己的服务居然也会失败!'s权限不足,服务器拒绝吗?为了搞清楚服务器做了什么,我用stracemosquitto重启了服务器,试图捕捉应用的执行轨迹,屏幕有规律的滚动epoll_wait信息,提示服务器进入了epoll循环。
当客户端承诺Unabletoconnect时,strace没有从服务器捕获任何违反规则的系统调用,比如TCP必须使用的accept。
为了证明正常连接发生时服务器会执行系统调用accept,我把主机修改为127.0.0.1然后又用strace抢了一次。果不其然,我看到了接受的身影(可以看到在第四步手稿图中标注的)。
所以当我发起连接到网卡地址192.168.81.198的时候,服务器应用根本没有收到协议栈的数据,然后我打开Wireshark抓取TCP数据,探究数据交互过程中发生了什么。
Wireshark操作界面选择抓取界面Loopback:lo。
将客户端发起的连接拦截分别与127.0.0.1和192.168.81.198进行比较。连接环回地址可以成功完成三次握手(对应序列号21:syn;22:SYN、ACK23: ack),但与本地网卡的连接被重置(对应序列号15:sync;16:RST、ACK)。
重置连接的原因可能是IP不存在、服务器未启动、此端口上没有服务或者连接被防火墙过滤。鉴于已经排除了防火墙,剩下的大概就是本地服务器套接字设置了。输入“netstat-ano|grep1883”来检查MQTT监听端口的状态。
原因找到了。本地监听地址是127.0.0.1:1883,不是0.0.0.03601883,所以拒绝任何外部连接。
怎么处理呢?测试环境下mosquitto是不带任何参数的,想必可以传递参数、配置文件灵活的更改mosquitto的特性。注意到另外一台x86平台Linux系统上已经搭建好mosquitto,ps-aux查看mosquitto的启动参数,“mosquitto-c/etc/mosquitto/mosquitto.conf”。x86平台下的mosquitto.conf文件内容短小且没有任何注释信息,也没看到看似监听配置的关键词。
同目录下还有另一个文件mosquitto.conf.example,他的内容要丰富得多,有详细的介绍。
OnsystemsthatsupportUnixDomainSockets,itisalsopossibletocreateaUnixsocketratherthanopeningaTCPsocket.Inthiscase,theportnumbershouldbesetto0andaunixsocketpathmustbeprovided,e.g.listener0/tmp/mosquitto.sock
listenerport-number[ipaddress/hostname/unixsocketpath]
按照说明,重新编辑mosquitto.conf.example文件添加下面两行,配置文件传递给服务器应用程序解析,netstat查询到0.0.0.0:1883监听,最后连接本地地址192.168.81.198成功。
#mosquitto.conf.examplelistener18830.0.0.0allow_anonymoustrue
上一篇:喝红酒有什么坏处吗
下一篇:明治维新持续了多少年了