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 关于sock发送失败的问题

Other Parts Discussed in Thread: CC3200

我在使用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】的问题呢?

    关注中,我也遇到了