在CC3200SDK_1.2.0里面的库文件中提供了使能或者禁能socket 设置keepalive的功能,但是没有提供根据需要设置TCP_KEEPIDLE、TCP_KEEPINTVL、TCP_KEEPCNT这三个参数的功能。我就借鉴Linux下面对于相似功能的设置,程序如下:
int32_t setKeepAlive(int32_t fd)
{
SlSockKeepalive_t enableOption;
enableOption.KeepaliveEnabled = 1;
int32_t keepIdle = 20;
int32_t keepInterval = 5;
int32_t keepCount = 3;
if(fd < 1)
return _ERROR;
else
{
if(sl_SetSockOpt(fd,SOL_SOCKET,SO_KEEPALIVE, &enableOption, sizeof(enableOption)) < 0)
{
return SOCKET_OPT_ERROR;
}
if( sl_SetSockOpt(fd, SL_IPPROTO_TCP, TCP_KEEPIDLE, &keepIdle, sizeof(keepIdle)) < 0)
return SOCKET_OPT_ERROR;
if( sl_SetSockOpt(fd, SL_IPPROTO_TCP, TCP_KEEPINTVL, &keepInterval, sizeof(keepInterval)) < 0)
return SOCKET_OPT_ERROR;
if( sl_SetSockOpt(fd, SL_IPPROTO_TCP, TCP_KEEPCNT, &keepCount, sizeof(keepCount)) < 0)
return SOCKET_OPT_ERROR;
return _OK;
}
}
程序执行完第2个sl_SetSockOpt函数的时候就返回错误,退出了,这意味着自己的野路子行不通了(这段代码应该是没有问题的,因为我在linux上面测试过的)。但是我之前看到过有人用CC3200芯片实现了keepalive机制的,所以想问有没有人知道怎么弄的?
Yonghua Pan:
CC3200有keepalive机制,时间是5分钟一次。目前只能支持enable/disable, 不能修改这个interval.
MA DONG:
回复 Yonghua Pan:
因为我在市场上成熟产品(基于CC3200芯片)上看到有人实现了Keepalive这个机制,且该产品的interval为10秒。那是不是与SDK版本有关,我用的是1.2.0,以前的版本可以设置吗?
MA DONG:
回复 Yonghua Pan:
好的,谢谢回答。希望TI后续可以考虑将这个功能完善下。
user3554786:
回复 MA DONG:
我找到TI 关于Keep alive 参数的设置方法,请参考
https://e2e.ti.com/support/embedded/tirtos/f/355/p/513818/1867744