This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

关于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。