CC3100 TCP Socket NonBlocking 报错
伙伴们:
使用CC3100 TCP Socket 作为Client,以非阻塞连接server,server端监听显示已经连接成功,但是CC3100函数调用结果返回为失败,返回值为SL_EALREADY,如果忽略该返回值,socket能够正常收发,但是现在不能忽略这个返回值。我改怎么办?贴出代码~
_i32 SimpleLink_BsdTcpClient(_u32 ipAddr,_u16 Port,_u16 *socketID) { SlSockAddrIn_t Addr; SlSockNonblocking_t enableOption; _u16 AddrSize = 0; _i16 SockID = 0; _i16 Status = 0; Addr.sin_family = SL_AF_INET; Addr.sin_port = sl_Htons((_u16)Port); Addr.sin_addr.s_addr = sl_Htonl((_u32)ipAddr); AddrSize = sizeof(SlSockAddrIn_t); InitializeAppVariables(); SockID = sl_Socket(SL_AF_INET,SL_SOCK_STREAM, 0); if( SockID < 0 ) { CLI_Write(" [TCP Client] Create socket Error \n\r"); ASSERT_ON_ERROR(SockID); } enableOption.NonblockingEnabled = 1; sl_SetSockOpt(SockID,SL_SOL_SOCKET,SL_SO_NONBLOCKING, (_u8 *)&enableOption,sizeof(enableOption)); // Enable/disable nonblocking mode Status = sl_Connect(SockID, ( SlSockAddr_t *)&Addr, AddrSize); // if( Status < 0 ) // { // sl_Close(SockID); // CLI_Write(" [TCP Client] TCP connection Error \n\r"); // ASSERT_ON_ERROR(Status); // } *socketID=SockID; // Status = sl_Close(SockID); ASSERT_ON_ERROR(Status); return SL_SUCCESS; }
sl_SetSockOpt 设置为非阻塞,Status = sl_Connect(SockID, ( SlSockAddr_t *)&Addr, AddrSize); 连接server,server显示连接成功,并且能够正常通信,但是
返回值Status=SL_EALREADY,该值在Sokcet.h中的意义:#define SL_EALREADY (-114) /* Non blocking connect in progress, try again */
代码有问题?
忘记说明了,以阻塞方式使用Socket 连接Server是没有问题的。
iStatus = -1; while( iStatus < 0 ) { iStatus = sl_Connect(iSockID, ( SlSockAddr_t *)&sAddr, iAddrSize); if( iStatus == SL_EALREADY) { MAP_UtilsDelay(10000); } }
但是我Socket已经连接成功了,并且能够正常收发数据,如果收忽略该错误按照上面流程重新连接,尽管成功还是SL_EALREADY错误。
我用的STM32F103,时钟72M,是不是哪里设置超时太短了?导致连接成功还是超时?
调用sl_connect每次返回的都是错误值吗?
还是第一次错误值,后面正常了
每次连接连接状态返回值都显示错误,但是能够正常通信。
每次连接都报这个错误