事情是这样的,我用cc3000做服务端,笔记本做客户端,采用tcp相互通信。
问题:在一定时间内,双方未进行socket通讯,cc3000是否会自动关闭套接字socket。
以下是实验过程
实验一、连接成功后,客户端(笔记本)每隔一定时间发送数据给服务端(cc3000),当间隔超过55秒左右时,客户端(笔记本)发送失败,send函数返回-1;cc3000 recv函数返回-57;
实验二、连接成功后,服务端(cc3000)每隔一定时间发送数据给客户端(笔记本),同样的,当间隔超过55秒左右时,发送失败,cc3000 send函数 一直阻塞;客户端(笔记本) recv 函数返回 0;
实验三、连接成功后,服务端(cc3000)主动关闭套接字socket,调用closesocket(),然后调用recv,返回 -57;
实验四、连接成功后,服务端(cc3000)主动关闭套接字socket,调用closesocket(),然后调用send,返回 -1;
序号 | 发送端 | 时间间隔(s) | cc3000是否收到数据包 | 具体情况 |
1 | 客户端(笔记本) | 10 | √ | |
2 | 20 | √ | ||
3 | 30 | √ | ||
4 | 40 | √ | ||
5 | 50 | √ | ||
6 | 60 | X | cc3000 recv函数返回 -57 客户端 send函数返回 -1 |
|
7 | cc3000 | 10 | √ | |
8 | 20 | √ | ||
9 | 30 | √ | ||
10 | 40 | √ | ||
11 | 50 | √ | ||
12 | 60 | X | cc3000 send函数 一直阻塞 客户端 recv函数返回 0 |
猜测:CC3000是否有一套机制,在一定时间内套接字未进行通信,会自动关闭?如果是,但是我并未受到socket断开的事件信号HCI_EVNT_BSD_TCP_CLOSE_WAIT。
求大神解答!谢谢!
mei ha:
回复 gaoyang9992006:
谢谢 gaoyang9992006
很偶然的,刚才看到官方命令说明,一个套接字在静止60秒之后将会被关闭。
http://processors.wiki.ti.com/index.php/CC3000_HCI_DATA_messages#HCI_DATA_SEND_.280×81.29
HCI_DATA_SEND (0x81)
HCI_DATA_SEND message is used to transmit a TCP packet to a socket. Before issuing a HCI_DATA_SEND message to CC3000, a socket should first be created using HCI_CMND_SOCKET (0x1001). Please note that a socket will be closed by CC3000 after 60 seconds of inactivity, thus a time between creating a socket and issuing HCI_DATA_SEND should not exceed this period! Use the Socket Handle returned by HCI_EVNT_SOCKET (0x1001) in the appropriate HCI_DATA_SEND argument field.