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.

CC3220 socket 超时设置,第二次设置时报SL_ERROR_BSD_EBADF(-9)错误



在进行CC3220TCP socket接受超时设置时,创建TCP socket,第一次连接上client时,可以正确设置TCP socket超时,断开连接时,第二次设置超时,报错SL_ERROR_BSD_EBADF(-9)

// waiting for an incoming TCP connection
clientfd=SL_ERROR_BSD_EAGAIN;
while( clientfd < 0 )
{
// accepts a connection form a TCP client, if there is any
// otherwise returns SL_EAGAIN
clientfd = accept(server, (struct sockaddr *)&clientAddr, &addrlen);
if( clientfd == SL_ERROR_BSD_EAGAIN )
{
usleep(10000);
}
else if( clientfd < 0 )
{
// error
sl_Close(clientfd);
sl_Close(server);
return(NULL);
// ASSERT_ON_ERROR(ACCEPT_ERROR);
}
}

TimeVal.tv_sec = 7; // Seconds
TimeVal.tv_usec = 0; // Microseconds. 10000 microseconds resolution

// setting socket option to enable receive timeout
status = sl_SetSockOpt(clientfd, SL_SOL_SOCKET, SL_SO_RCVTIMEO,
(_u8 *)&TimeVal, sizeof(TimeVal));
if(status < 0)
{
UART_PRINT("[line:%d, error:%d] %s\n\r", __LINE__, status,
SL_SOCKET_ERROR);
sl_Close(clientfd);
sl_Close(server);
return(NULL);
}

  • #define SL_ERROR_BSD_EBADF (-9L) /* Bad file number */

    TCP socket的操作建议参考下Network Terminal例程
  • 最近解决发现混合使用了socket.h和sl_socket.h中的API,统一改为socket.h中API就不会第二次设置超时时出现-9 SL_ERROR_BSD_EBADF错误

    while ((clientfd = accept(server, (struct sockaddr *)&clientAddr, &addrlen)) != -1)
    {
    // setting socket option to enable receive timeout
    TimeVal.tv_sec = 7; // Seconds
    TimeVal.tv_usec = 0; // Microseconds. 10000 microseconds resolution
    status = setsockopt(clientfd, SOL_SOCKET, SO_RCVTIMEO,(_u8 *)&TimeVal, sizeof(TimeVal));

    if(status < 0)
    {
    UART_PRINT("[line:%d, error:%d] %s\n\r", __LINE__, status,
    SL_SOCKET_ERROR);
    close(clientfd);
    // sl_Close(server);
    }

    UART_PRINT("tcpHandler: Creating thread clientfd = %x\n", clientfd);

    thread = TaskCreate(TcpServerWorker, NULL, 3, 2048, (uintptr_t)clientfd, 0, 0);

    if (!thread)
    {
    UART_PRINT( "tcpHandler: Error - Failed to create new thread.\n");
    close(clientfd);
    sleep(1);
    }

    /* addrlen is a value-result param, must reset for next accept call */
    addrlen = sizeof(clientAddr);
    }