微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI WIFI设计交流 > 关于CC3200在TCP短连接中,频繁创建关闭socket的问题

关于CC3200在TCP短连接中,频繁创建关闭socket的问题

时间:10-02 整理:3721RD 点击:

相关代码如下:

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。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top