我在CC3000上建立了一个socket(例如UDP),之后不进行通讯,大约50秒这个socket就无效了。无效的意思是当我在次建立一个socket时返回的句柄是上次那个无效的socket。
如果我改为在CC3000上建立一个TCP socket并且作为服务端,并调用accept,这时我在PC机的调试助手上建立客户端去连接CC3000上的服务端。之后不做通讯(不发送数据给CC300,0, 在CC3000我也没有发送数据给客户端),大约过了50多秒之后。PC机的调试助手就显示这个连接被断开了。 然后我重复上述在PC机建立连接的过程,并等待它显示断开连接(同样没有通讯)。当我第三次连接时就会返回第一次连接时返回的句柄。这就说明第一次建立的连接确实是无效了。
不知道是什么问题。
Yonghua Pan:
It's because socket inactivity timer expired. Please refer to: http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html.
li weishi:
回复 Yonghua Pan:
打开的网页是空白的。
但是50秒是不是太短了呢。并且CC3000关闭时我并没有得到任何事件通知。可能过会还会在另外的地方使用了。
不只是TCP,UDP的socket也会失效。
*************************************************
但是PC机上建立的socket却没有这个问题啊。
另外想问下我遇到的这个问题其他人遇到了吗。或者说这只是一个正常的现象呢?
谢谢。
Yonghua Pan:
回复 li weishi:
因为不像PC有很多的资源,像这种系统socket数目很有限。所以我们建议如果真是要长时间保持连接的话,最好是维护一个像心跳的功能,就是过段时间就发心跳包。
li weishi:
回复 Yonghua Pan:
谢谢您的耐心解答。
也就是说我遇到的这个是正常现象了,是吗?
不过我这里有4块CC3000的模块,其中有一块是不会出现这种现象的。其他三块却有。
Yonghua Pan:
回复 li weishi:
你4块CC3000用的firmware是一模一样的吗?你会不会用wireshark, 可以抓一下TCP/IP包看一下是不是有什么包导致了这种现象。
li weishi:
回复 Yonghua Pan:
四块CC3000的固件版本都是一样的。读出来都是1.24。抓包我可以试试。
我想知道这是正常现象吗?麻烦您了。
谢谢。
li weishi:
回复 Yonghua Pan:
这是Sniffer抓包的截图。
其中192.168.1.100是CC3000模块。另外一个是PC机。
我并没有主动去控制CC3000去关闭连接。
只是觉的这个50多秒的时间由点短。而且之前有一个模块是没有这个现象的。
还是说这个时间的长短可以由EEPROM的中的参数决定呢?
如果是正常现象的话,那也没办法了。暂时只能这样。
Yonghua Pan:
回复 li weishi:
这个参数是不可改的,是固化的。如我之前建议的,可以在应用层里维护heartbeat功能保证它不断。
Michael1:
回复 Yonghua Pan:
你好,我最近用刚买了CC3000也有这个问题,这个问题只能通过发送心跳包才能解决这个问题吗?是不是还能有其他的方法解决这个问题,是不是因为休眠产生的影响?谢谢!