1、使用raw/callback API編程,用戶編程的方法是向內核注冊各種自定義的回調函數,回調函數是與內核實現交換的唯一方式。
recv_udp, accept_function, sent_tcp, recv_tcp, do_connected, poll_tcp, err_tcp!
2、協議棧API(sequential API)是基於raw/callback API實現的,它與內核交換的方式也只能通過回調。
netconn_new, netconn_delete, netconn_getaddr, netconn_connect, netconn_disconnect, netconn_listen, netconn_accept,
netconn_recv, netconn_send, netconn_write, netconn_close
注: netconn_send 是給UDP使用的。
netconn_write是給TCP使用的。但是tcp發送時,有三種選擇:
(1)NETCONN_COPY 標志告訴協議棧將待發送數據拷貝到內核進程所屬的內存空間,在這種情況下,會消耗系統的部分時間和內存資源,但是用戶進程
可以在向內核提交數據后立即重新使用這些數據區域,甚至刪除這些區域,而不必等待內核是否完全正確發送。如果用戶沒有設置該位,則內核構造發送
數據包是,會引用這些發送數據的內存區域,在這種情況下,用戶進程不能再對這些數據進行修改,這種方式通常用在靜態數據(ROM數據)的發送中。
對於非ROM數據的發送,用戶應盡量設置NETCONN_COPY標志。
(2)NETCONN_MORE標志,當其置位時,組裝這些數據的最后一個TCP報文段首部PSH標志將被設置,這樣,數據在接收端將被盡快的遞交給上層,而不會緩沖等待。
3、BSD API(或者說 SOCKET API),是Lwip設計者對sequential API函數進行了簡單封裝后的函數。
socket、bind、connect、listen、accept、sendto、write、recvfrom、read、close。
sendto、recvfrom:主要用於UDP,但是也可用於TCP。
write、read:主要用於TCP,但是也可用於UDP。