⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 net_sock.c

📁 从Luminary官方网站下载的LM3S6000系列的UCos+Tcp/IP的源码, 经本人稍微修改后可直接在IAR6.2下编译通过,里面包括了LM3S6000系列的所有外设UART, PWn....
💻 C
📖 第 1 页 / 共 5 页
字号:


                                                                /* --------------------- GET SOCK --------------------- */
    psock = NetSock_Get(perr);
    if (psock == (NET_SOCK *)0) {
        NetOS_Unlock();
        return (NET_SOCK_BSD_ERR_OPEN);                         /* Rtn err from NetSock_Get().                          */
    }


                                                                /* -------------------- INIT SOCK --------------------- */
    psock->Family   = protocol_family;
    psock->Protocol = protocol;
    psock->SockType = sock_type;
    sock_id         = psock->ID;


                                                                /* ----------------- RELEASE NET LOCK ----------------- */
    NetOS_Unlock();


   *perr =  NET_SOCK_ERR_NONE;

    return (sock_id);                                           /* ------------------- RTN SOCK ID -------------------- */
}


/*$PAGE*/
/*
*********************************************************************************************************
*                                           NetSock_Close()
*
* Description : (1) Close a socket :
*
*                   (a) Acquire  network lock
*                   (b) Validate socket
*                       (1) Validate socket used
*                       (2) Validate socket connection state
*                   (c) Close    socket
*                   (d) Release  network lock
*
*               (2) Once an application closes its socket, NO further operations on the socket are allowed
*                   & the application MUST NOT continue to access the socket.
*                   
*                   #### Continued access to the closed socket by the application layer will likely corrupt
*                   the network socket layer.
*
*
* Argument(s) : sock_id     Socket descriptor/handle identifier of socket to close.
*
*               perr        Pointer to variable that will receive the return error code from this function :
*
*                               NET_SOCK_ERR_NONE                       Socket successfully closed.
*                               NET_SOCK_ERR_NOT_USED                   Socket NOT currently used.
*                               NET_SOCK_ERR_CLOSED                     Socket already closed.
*                               NET_SOCK_ERR_INVALID_STATE              Invalid socket state.
*
*                                                                       ------- RETURNED BY NetSock_IsUsed() : -------
*                               NET_ERR_INIT_INCOMPLETE                 Network initialization NOT complete.
*                               NET_SOCK_ERR_INVALID_SOCK               Invalid socket number.
*
*                                                                       - RETURNED BY NetSock_CloseHandlerStream() : -
*                               NET_SOCK_ERR_FAULT                      Socket fault; connection(s) aborted.
*                               NET_SOCK_ERR_INVALID_FAMILY             Invalid socket protocol family.
*                               NET_SOCK_ERR_CONN_CLOSE_IN_PROGRESS     Socket close already in progress.
*                               NET_SOCK_ERR_CONN_FAIL                  Socket connection operation(s) failed.
*                               NET_SOCK_ERR_CONN_SIGNAL_TIMEOUT        Socket connection close NOT signaled by
*                                                                           timeout.
*
*                               NET_CONN_ERR_INVALID_CONN               Invalid network connection number.
*                               NET_CONN_ERR_NOT_USED                   Network connection NOT currently used.
*                               NET_CONN_ERR_NULL_PTR                   Argument(s) passed a NULL pointer.
*                               NET_CONN_ERR_INVALID_ADDR_LEN           Invalid network connection address length.
*                               NET_CONN_ERR_ADDR_NOT_USED              Network connection address NOT in use.
*
*                                                                       --------- RETURNED BY NetOS_Lock() : ---------
*                               NET_OS_ERR_LOCK                         Network access NOT acquired.
*
* Return(s)   : NET_SOCK_BSD_ERR_NONE,  if NO errors (see Note #4).
*
*               NET_SOCK_BSD_ERR_CLOSE, otherwise.
*
* Caller(s)   : close().
*
*               This function is a network protocol suite application interface (API) function & MAY be 
*               called by application function(s).
*
* Note(s)     : (3) NetSock_Close() blocked until network initialization completes.
*
*                   See 'NetSock_IsUsed()  Note #1'.
*
*               (4) NO BSD socket error is returned for any internal error while closing the socket.
*
*               (5) Default case already invalidated in NetSock_Open().  However, the default case is
*                   included as an extra precaution in case 'SockType' is incorrectly modified.
*********************************************************************************************************
*/
/*$PAGE*/
NET_SOCK_RTN_CODE  NetSock_Close (NET_SOCK_ID   sock_id,
                                  NET_ERR      *perr)
{
#if ((NET_CTR_CFG_ERR_EN      == DEF_ENABLED)                    && \
     (CPU_CFG_CRITICAL_METHOD == CPU_CRITICAL_METHOD_STATUS_LOCAL))
    CPU_SR              cpu_sr;
#endif
    NET_SOCK           *psock;
    NET_SOCK_RTN_CODE   rtn_code;


                                                                /* ----------------- ACQUIRE NET LOCK ----------------- */
    NetOS_Lock(perr);
    if (*perr != NET_OS_ERR_NONE) {
         return (NET_SOCK_BSD_ERR_CLOSE);
    }



#if (NET_ERR_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)                 /* ---------------- VALIDATE SOCK USED ---------------- */
   (void)NetSock_IsUsed(sock_id, perr);
    if (*perr != NET_SOCK_ERR_NONE) {
         NetOS_Unlock();
         return (NET_SOCK_BSD_ERR_CLOSE);
    }
#endif


    psock = &NetSock_Tbl[sock_id];
                                                                /* ------------- VALIDATE SOCK CONN STATE ------------- */
    switch (psock->State) {
        case NET_SOCK_STATE_FREE:
        case NET_SOCK_STATE_DISCARD:
             NET_CTR_ERR_INC(NetSock_ErrNotUsedCtr);
             NetOS_Unlock();
            *perr =  NET_SOCK_ERR_NOT_USED;
             return (NET_SOCK_BSD_ERR_CLOSE);                   /* Prevent 'break NOT reachable' compiler warning.      */


        case NET_SOCK_STATE_CLOSED:                             /* If CLOSED from init open  ...                        */
        case NET_SOCK_STATE_CLOSED_FAULT:                       /* ... OR internal fault(s), ...                        */
             NetSock_Free(psock);                               /* ... sock need ONLY be freed.                         */
             NetOS_Unlock();
            *perr =  NET_SOCK_ERR_CLOSED;                       /* Rtn net sock err but rtn NO BSD err (see Note #4).   */
             return (NET_SOCK_BSD_ERR_NONE);                    /* Prevent 'break NOT reachable' compiler warning.      */


        case NET_SOCK_STATE_BOUND:
        case NET_SOCK_STATE_LISTEN:
        case NET_SOCK_STATE_CONN:
        case NET_SOCK_STATE_CONN_IN_PROGRESS:
        case NET_SOCK_STATE_CONN_DONE:
        case NET_SOCK_STATE_CLOSE_IN_PROGRESS:
        case NET_SOCK_STATE_CLOSING_DATA_AVAIL:
             break;

             
        case NET_SOCK_STATE_NONE:
        default:
             NetSock_CloseSockFromClose(psock);
             NetOS_Unlock();
            *perr =  NET_SOCK_ERR_INVALID_STATE;                /* Rtn net sock err but rtn NO BSD err (see Note #4).   */
             return (NET_SOCK_BSD_ERR_NONE);                    /* Prevent 'break NOT reachable' compiler warning.      */
    }


/*$PAGE*/
                                                                /* -------------------- CLOSE SOCK -------------------- */
    switch (psock->SockType) {
        case NET_SOCK_TYPE_DATAGRAM:
             NetSock_CloseHandler(psock, DEF_YES, DEF_YES);
             rtn_code = NET_SOCK_BSD_ERR_NONE;
             break;


#if (NET_SOCK_CFG_TYPE_STREAM_EN == DEF_ENABLED)
        case NET_SOCK_TYPE_STREAM:
             rtn_code = NetSock_CloseHandlerStream(sock_id, psock, perr);
             break;
#endif

        case NET_SOCK_TYPE_NONE:
        default:                                                /* See Note #5.                                         */
             NetSock_CloseSockFromClose(psock);
             NET_CTR_ERR_INC(NetSock_ErrInvalidSockTypeCtr);
             NetOS_Unlock();
            *perr =  NET_SOCK_ERR_INVALID_TYPE;                 /* Rtn net sock err but rtn NO BSD err (see Note #4).   */
             return (NET_SOCK_BSD_ERR_NONE);                    /* Prevent 'break NOT reachable' compiler warning.      */
    }


                                                                /* ----------------- RELEASE NET LOCK ----------------- */
    NetOS_Unlock();


   *perr =  NET_SOCK_ERR_NONE;

    return (rtn_code);
}


/*$PAGE*/
/*
*********************************************************************************************************
*                                       NetSock_CloseFromConn()
*
* Description : Close a socket via a network connection.
*
*               (1) When a network connection closes a socket, the socket :
*
*                   (a) (1) Closes NO other network connection(s),
*                       (2) MUST NOT recursively re-close other network connection(s);
*
*                   (b) SHOULD clear network connection(s)' handle identifiers.
*
*                   See also             'NetSock_CloseSockHandler()  Note #2a',
*                            'net_tcp.c   NetTCP_ConnCloseFromConn()  Note #1',
*                          & 'net_conn.c  NetConn_CloseFromApp()      Note #1b'.
*
*               (2) Closes socket but does NOT free the socket since NO mechanism or API exists to close
*                   an application's reference to the socket.
*
*                   See also 'NetSock_CloseSock()  Note #2b'.
*
*
* Argument(s) : sock_id     Socket descriptor/handle identifier of socket to close.
*
* Return(s)   : none.
*
* Caller(s)   : NetConn_CloseApp().
*
*               This function is an INTERNAL network protocol suite function & MUST NOT be called by 
*               application function(s).
*
* Note(s)     : none.
*********************************************************************************************************
*/
/*$PAGE*/
void  NetSock_CloseFromConn (NET_SOCK_ID  sock_id)
{
#if ((NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED)                    && \
     (NET_CTR_CFG_ERR_EN         == DEF_ENABLED)                    && \
     (CPU_CFG_CRITICAL_METHOD    == CPU_CRITICAL_METHOD_STATUS_LOCAL))
    CPU_SR     cpu_sr;
#endif
#if (NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED)
    NET_ERR    err;
#endif
    NET_SOCK  *psock;

                                                                /* ------------------ VALIDATE SOCK ------------------- */
    if (sock_id == NET_SOCK_ID_NONE) {
        return;
    }

#if (NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED)                 /* ---------------- VALIDATE SOCK USED ---------------- */
   (void)NetSock_IsUsed(sock_id, &err);
    if (err != NET_SOCK_ERR_NONE) {
        return;
    }
#endif


    psock = &NetSock_Tbl[sock_id];

#if (NET_ERR_CFG_ARG_CHK_DBG_EN == DEF_ENABLED)                 /* ------------- VALIDATE SOCK CONN STATE ------------- */
    switch (psock->State) {
        case NET_SOCK_STATE_FREE:
        case NET_SOCK_STATE_DISCARD:
             NET_CTR_ERR_INC(NetSock_ErrNotUsedCtr);
             return;                                            /* Prevent 'break NOT reachable' compiler warning.      */


        case NET_SOCK_STATE_CLOSED_FAULT:
             return;                                            /* Prevent 'break NOT reachable' compiler warning.      */


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -