📄 net_sock.c
字号:
/* --------------------- 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 + -