微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI WIFI设计交流 > CC3200 关于sock发送失败的问题

CC3200 关于sock发送失败的问题

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

我在使用CC3200的时候发现,在使用sock连接的时候,在发送数据后关闭sock,偶尔会跳进SimpleLinkSockEventHandler()这个函数里,产生了SL_SOCKET_TX_FAILED_EVENT,跟SL_ECLOSE错误。打印信息提示[SOCK ERROR]-close socket (21) operation failed to transmit all queued packets.

我想问什么样的条件会产生这个错误?然后怎么去避免?

你是用TCP还是UDP的套接字呢?如果是用TCP, sl_Send返回的值是多少呢?

可能是因为你上层的数据发送下去了,不过底层WIFI的传输还没结束,你这个时候把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返回值是对的,就是等于它发送的长度。

问:那如果真是像你说的底层发送没完成造成的。那我应该加什么处理才能避免这种情况?

如何避免关socket 出现的 【sock error】的问题呢?

关注中,我也遇到了

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

网站地图

Top