关于CC3200在TCP短连接中,频繁创建关闭socket的问题
相关代码如下:
while(1){
if(AppReadSendDataFIFO(&t_SendData)){ //读取发送FIFO的数据
sTestBufLen = NetAppDataPOST(GateWaySendBuf,&t_SendData); //转换成POST格式的数据
if(sTestBufLen > 0 ){
usPort = WS_PORT_NUM;
uaDestinationIp = WS_IP_ADDR;
//filling the TCP server socket address
sAddr.sin_family = SL_AF_INET;
sAddr.sin_port = sl_Htons((unsigned short)usPort);
sAddr.sin_addr.s_addr = sl_Htonl((unsigned int)uaDestinationIp);
iAddrSize = sizeof(SlSockAddrIn_t);
osi_Sleep(100); //socket前延时
// creating a TCP socket
g_wsSockID = sl_Socket(SL_AF_INET,SL_SOCK_STREAM, 0);
if( g_wsSockID < 0 )
{
ERR_PRINT(SOCKET_CREATE_ERROR);
}
else{
// connecting to TCP server
iStatus = sl_Connect(g_wsSockID, ( SlSockAddr_t *)&sAddr, iAddrSize);
if( iStatus < 0 )
{
// error
sl_Close(g_wsSockID);
ERR_PRINT(CONNECT_ERROR);
}
else{
// sending multiple packets to the TCP server
// sending packet
iStatus = sl_Send(g_wsSockID, (char *)&GateWaySendBuf, sTestBufLen, 0 );//sTestBufLen
//osi_Sleep(500);
osi_Sleep(100);
if( iStatus < 0 )
{
// error
sl_Close(g_wsSockID);
ERR_PRINT(SEND_ERROR);
}
else{
sl_Close(g_wsSockID);
Report("Sent packets successfully\n\r");
}
}
}
}
}
}
代码的功能是:如果fifo里的数据,就将它转换成POST格式,然后用短连接发送到相应的TCP接口中。
在FIFO有大量数据,需要连续发送,需要频繁创建和关闭socket时,就会出现如下问题:
1、如果不在sl_Socket();前加延时osi_Sleep(100);那么创建socket的时候经常会出错。大概6次创建socket的时候就会出错。在程序中表现就是sl_Socket返回值为-10,然后执行了ERR_PRINT(SOCKET_CREATE_ERROR);加了osi_Sleep(100);延时这个现象就没了。这里的错误我感觉像是关闭socket的问题。运行了sl_Close这条命令后,它很像并不能马上关掉socket。导致短时间内多次循环后socket的队列累积之前没关掉的socket后满了。(因为我只有这个地方开了socket)。满了之后就出错了。那这要怎么处理?不可能在sl_Close后加硬延时吧?而且我发现我运行的所有sl_Close都是返回0的。也就是说没有失败的?那为什么成功了,socket没有立马关掉?而是过了一会弹出[SOCK ERROR] - close socket (23) operation failed to transmit all queued packets的错误。
问:如果不想用加延时的方法解决这个问题该怎么做?
2、打印信息中偶尔会出现[SOCK ERROR]-close socket (21) operation failed to transmit all queued packets.这样的错误信息。按你说的,这是上层数据发送下去,底层还没结束造成的。那我要怎么才知道它底层什么时候结束?不可能说等一个长时间吧?我的数据又是不定长的。说不好要等多久。而且,我socket配置的是阻塞式的。它没发完也会运行其他指令么?而且虽然会报错误,但是sl_send返回值是对的,就是等于它发送的长度。
问:那如果真是像你说的底层发送没完成造成的。那我应该加什么处理才能避免这种情况?
从你的代码看,好像服务器的IP和端口是固定的,是这样吗?如果是这样的话,能否保持TCP的连接,socket不要关,需要发送数据的时候就直接发送好了。
不建议你短时间去close->create新的socket。