CC3200 socket 设置为非阻塞
时间:10-02
整理:3721RD
点击:
TI:
我是按照 TCP socket demo
iSockID = sl_Socket(SL_AF_INET,SL_SOCK_STREAM, 0); if( iSockID < 0 ) { // error ASSERT_ON_ERROR(SOCKET_CREATE_ERROR); } iAddrSize = sizeof(SlSockAddrIn_t); // binding the TCP socket to the TCP server address iStatus = sl_Bind(iSockID, (SlSockAddr_t *)&sLocalAddr, iAddrSize); if( iStatus < 0 ) { // error sl_Close(iSockID); ASSERT_ON_ERROR(BIND_ERROR); } // putting the socket for listening to the incoming TCP connection iStatus = sl_Listen(iSockID, 0); if( iStatus < 0 ) { sl_Close(iSockID); ASSERT_ON_ERROR(LISTEN_ERROR); } // setting socket option to make the socket as non blocking iStatus = sl_SetSockOpt(iSockID, SL_SOL_SOCKET, SL_SO_NONBLOCKING, &lNonBlocking, sizeof(lNonBlocking)); if( iStatus < 0 ) { sl_Close(iSockID); ASSERT_ON_ERROR(SOCKET_OPT_ERROR); } iNewSockID = SL_EAGAIN; // waiting for an incoming TCP connection while( iNewSockID < 0 ) { // accepts a connection form a TCP client, if there is any // otherwise returns SL_EAGAIN iNewSockID = sl_Accept(iSockID, ( struct SlSockAddr_t *)&sAddr, (SlSocklen_t*)&iAddrSize); if( iNewSockID == SL_EAGAIN ) { MAP_UtilsDelay(10000); } else if( iNewSockID < 0 ) { // error sl_Close(iNewSockID); sl_Close(iSockID); ASSERT_ON_ERROR(ACCEPT_ERROR); } } // waits for 1000 packets from the connected TCP client while (lLoopCount < g_ulPacketCount) { iStatus = sl_Recv(iNewSockID, g_cBsdBuf, iTestBufLen, 0); if( iStatus <= 0 ) { // error sl_Close(iNewSockID); sl_Close(iSockID); ASSERT_ON_ERROR(RECV_ERROR); } lLoopCount++; } Report("Recieved %u packets successfully\n\r",g_ulPacketCount); // close the connected socket after receiving from connected TCP client iStatus = sl_Close(iNewSockID);
这个 sl_SetSockOpt(); 试过任何位置, 从socket() 后面到 Recv() 前面都试过, 也试过多次设置, 非阻塞都是无效。
请问, 作为 TCP Server 应该怎么设置这个非阻塞呢?
TCP Server设置非阻塞时,要在socket创建成功后设置,并且参数要正确,在你的程序中调用SetSockOpt输入参数第一项要用iNewSockID,而不是iSockID。