LWIP -- netconn结构体及其接口分析

一个基本的socket建立顺序是
Server端:socket(), bind(),listen(),accept(), recv(), recvfrom(), recvmsg()
Client端:socket(),connect(),send(), sendto(), sendmsg()

基础知识:LWIP通信邮箱,netconn结构体


在学习LWIP socket接口的时候,发现了netconn结构体的使用特别频繁,socket的API接口大部分使用了netconn结构体,决定对netconn结构体进行分析。

netconn结构体

/** Netconn 描述符 */
struct netconn {
  enum netconn_type type;  /** netconn 类型 (TCP, UDP or RAW) */
  enum netconn_state state;  /** netconn 当前状态 */
  union {
    struct ip_pcb  *ip;
    struct tcp_pcb *tcp;
    struct udp_pcb *udp;
    struct raw_pcb *raw;
  } pcb;  /** lwIP 内部协议控制块(重点!) */
  err_t last_err;  /** netconn 的最后一个错误 */
  sys_sem_t op_completed;  /** LWIP 核心信号量 sem */
  sys_mbox_t recvmbox;  /** 接收包的 mbox,直到它们被 netconn 应用程序线程获取(可以变得非常大) */
  sys_mbox_t acceptmbox;  /** (mbox将新连接存储在应用程序线程处理之前) */
  int socket;  /** 只用于套接字层 */
  s32_t send_timeout;  /** 超时等待发送数据,以毫秒为间隔(这意味着将数据以内部缓冲区的形式发送) */
  int recv_timeout;  /** 超时等待接收新数据,以毫秒为间隔(或连接到侦听netconns的连接) */
  int recv_bufsize;  /** 在recvmbox中排队的最大字节数,不用于TCP:调整TCP_WND! */
  int recv_avail;  /** 当前在recvmbox中被接收的字节数,对recv_bufsize进行测试,以限制用于UDP和RAW的recvmbox上的字节,用于FIONREAD */
  s16_t linger;  /** 值小于0意味着禁用 */
  u8_t flags;  /** flags持有更多netconn-internal状态,参见NETCONN_FLAG_定义 */
  size_t write_offset;  /** TCP:当传递到netconn_write的数据不适合发送缓冲区时,它会临时存储已经发送了多少。 */
  struct api_msg *current_msg;  /** TCP:当传递到netconn_write的数据不适合发送缓冲区时,这将临时存储消息。在连接和关闭期间也使用。 */
  netconn_callback callback;  /** 一个回调函数,它被告知这个netconn事件 */
};

netconn接口

err_t netconn_apimsg(tcpip_callback_fn fn, struct api_msg *apimsg)
//调用netconn_*函数的底半部,
//该函数在tcpip_thread的线程上下文中运行,并且具有对lwIP核心代码的独占访问权。
struct netconn *netconn_new_with_proto_and_callback(enum netconn_type t, u8_t proto,
                                               netconn_callback callback)
//创建一个具有回调函数的新netconn(特定类型),同时也创建了相应的pcb。
err_t   netconn_delete(struct netconn *conn);
//关闭一个网络连接“连接”并释放其资源。
//(UDP和RAW连接是完全关闭的,TCP pcbs在返回后可能仍然处于等待状态)
err_t   netconn_getaddr(struct netconn *conn, ip_addr_t *addr, u16_t *port, u8_t local);
//获取一个netconn的本地或远程IP地址和的端口。
err_t   netconn_bind(struct netconn *conn, const ip_addr_t *addr, u16_t port);
//绑定netconn到特定的本地IP地址和端口。
err_t   netconn_connect(struct netconn *conn, const ip_addr_t *addr, u16_t port);
//将一个netconn连接到一个特定的远程IP地址和端口。
err_t   netconn_disconnect (struct netconn *conn);
//断开当前的netconn(仅适用于UDP netconns)。
err_t   netconn_listen_with_backlog(struct netconn *conn, u8_t backlog);
//将TCP netconn设置为监听模式
err_t   netconn_accept(struct netconn *conn, struct netconn **new_conn);
//接受一个新的连接在TCP监听netconn上。
err_t   netconn_recv(struct netconn *conn, struct netbuf **new_buf);
//从netconn接收数据(以包含数据包缓冲区的netbuf的形式)。
err_t   netconn_recv_tcp_pbuf(struct netconn *conn, struct pbuf **new_buf);
//从TCP netconn接收数据(以pbuf的形式)
err_t   netconn_sendto(struct netconn *conn, struct netbuf *buf,
                     const ip_addr_t *addr, u16_t port);
//将数据(以netbuf的形式)发送到特定的远程IP地址和端口。
//只用于UDP和RAW netconns(而不是TCP)。
err_t   netconn_send(struct netconn *conn, struct netbuf *buf);
//通过UDP或RAW的netconn发送数据(已经连接了)。
err_t   netconn_write_partly(struct netconn *conn, const void *dataptr, size_t size,
                         u8_t apiflags, size_t *bytes_written);
//通过TCP netconn发送数据。
err_t   netconn_close(struct netconn *conn);
//关闭指定TCP netconn(不是删除它)。
err_t   netconn_shutdown(struct netconn *conn, u8_t shut_rx, u8_t shut_tx);
//关闭TCP netconn的一方或双方(不是删除它)。
err_t   netconn_join_leave_group(struct netconn *conn, const ip_addr_t *multiaddr,
                              const ip_addr_t *netif_addr, enum netconn_igmp join_or_leave);
//为UDP netconns加入多播组。
err_t   netconn_gethostbyname_addrtype(const char *name, ip_addr_t *addr, u8_t dns_addrtype);
//执行一个DNS查询,只返回一个IP地址。

你可能感兴趣的:(SylixOS,网络)