(以下函数详见sockets.c)
与socket相关的两个概念
- socket索引:int类型,取值为0、1、2…,对于类服务器,0通常是用于监听的lwip_accept,其他每连接一个客户端,依次分配1、2、3…,客户端正常断开连接后,分配的socket索引会回收,再次按从小到大的顺序重新分配给其他连接的客户端。
- socket本身:结构体,包含socket相关的多种信息
常用的socket函数使用的都是索引,目的是用简单的文件描述符的形式简化socket的应用。
socket索引
socket索引主要用于socket通信函数:
int lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen)
int lwip_bind(int s, const struct sockaddr *name, socklen_t namelen)
其中的int s即socket索引
socket本身
/** Contains all internal pointers and states used for a socket */
struct lwip_sock {/** sockets currently are built on netconns, each socket has one netconn */struct netconn *conn;/** data that was left from the previous read */union lwip_sock_lastdata lastdata;
#if LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL/** number of times data was received, set by event_callback(),tested by the receive and select functions */s16_t rcvevent;/** number of times data was ACKed (free send buffer), set by event_callback(),tested by select */u16_t sendevent;/** error happened for this socket, set by event_callback(), tested by select */u16_t errevent;/** counter of how many threads are waiting for this socket using select */SELWAIT_T select_waiting;
#endif /* LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL */
#if LWIP_NETCONN_FULLDUPLEX/* counter of how many threads are using a struct lwip_sock (not the 'int') */u8_t fd_used;/* status of pending close/delete actions */u8_t fd_free_pending;
#define LWIP_SOCK_FD_FREE_TCP 1
#define LWIP_SOCK_FD_FREE_FREE 2
#endif
};
二者之间的联系
sock = get_socket(s);