溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

lwip中TCP和UDP的API有哪些

發布時間:2021-12-30 09:18:02 來源:億速云 閱讀:160 作者:小新 欄目:互聯網科技

這篇文章給大家分享的是有關lwip中TCP和UDP的API有哪些的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

01、TCP相關API

1、tcp_arg()

該函數用于傳遞給應用程序的具體狀態,在控制塊標志建立以后調用,即在函數tcp_new()調用之后才能調用

功能

指定應該傳遞給所有回調函數的應用程序的具體狀態

原型

void tcp_arg(struct tcp_pcb *pcb, void *arg)

參數

pcb:當前TCP連接的控制塊

arg: 需要傳遞給回調函數的參數

返回

2、tcp_new()

該函數在定義一個tcp_pcb控制塊后應該首先被調用,以建立該控制塊的連接標志

功能

建立一個新的連接標志(pcb)

原型

struct tcp_pcb *tcp_new(void)

參數

返回

pcb: 正常建立了連接標志,返回建立的pcb

NULL:新的pcb內存不可用時

3、tcp_bind()

該函數用戶綁定本地的IP地址和端口號,用戶可以將其綁定在一個任意的本地IP地址上,它也只能在函數tcp_new()調用之后才能調用

功能

綁定本地IP地址和端口號

原型

err_t tcp_bind (struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port)

參數

pcb: 準備綁定的連接,類似于BSD標準中的Sockets

ipaddr:綁定的IP地址。如果為IP_ADDR_ANY,則將連接綁定到所有的本地IP地址上

port: 綁定的本地端口號。注意:千萬不要和其它的應用程序產生沖突

返回

ERR_OK:正確地綁定了指定的連接

ERR_USE: 指定的端口號已經綁定了一個連接,產生了沖突

4、tcp_listen()

當一個正在請求的連接被接收時,由tcp_accept()函數指定的回調函數將會被調用。當然,在調用本函數前,必須首先調用函數tcp_bind()來綁定一個本地的IP地址和端口號

功能

使指定的連接開始進入監聽狀態

原型

struct tcp_pcb *tcp_listen (struct tcp_pcb *pcb)

參數

pcb:指定將要進入監聽狀態的連接

返回

pcb: 返回一個新的連接標志pcb,它作為一個參數傳遞給將要被分派的函數。這樣做的原

因是處于監聽狀態的連接一般只需要較小的內存,于是函數tcp_listen()就會收回原始連接

的內存,而重新分配一個較小內存塊供處于監聽狀態的連接使用。

NULL: 監聽狀態的連接的內存塊不可用時,返回NULL。如果這樣的話,作為參數傳遞給

函數tcp_listen()的pcb所占用的內存將不能夠被分配。

5、tcp_listen_with_backlog()

該函數同tcp_listen()一樣,但是該函數將限制在監聽隊列中未處理的連接的數量,這是通過參數backlog來實現的。要使用該函數,需要在配置文件lwipopts.h中設置TCP_LISTEN_BACKLOG=1。

功能

使指定的連接開始進入監聽狀態,但將會限制監聽隊列中連接的數量

原型

struct tcp_pcb *tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog)

參數

pcb: 指定將要進入監聽狀態的連接

backlog: 限制監聽隊列中連接的數量

返回

pcb: 返回一個新的連接標志pcb,它作為一個參數傳遞給將要被分派的函數。這樣做的原

因是處于監聽狀態的連接一般只需要較小的內存,于是函數tcp_listen()就會收回原始

連接的內存,而重新分配一個較小內存塊供處于監聽狀態的連接使用。

NULL: 監聽狀態的連接的內存塊不可用時,返回NULL。如果這樣的話,作為參數傳遞

給函數tcp_listen()的pcb所占用的內存將不能夠被分配。

6、tcp_accepted()

這個函數通常在“accept”的回調函數中被調用。它允許LwIP去執行一些內務工作,例如,將新來的連接放入到監聽隊列中,以等待處理。

功能

通知LwIP一個新來的連接已經被接收

原型

void tcp_accepted(struct tcp_pcb *pcb)

參數

pcb: 已經被接收的連接

返回

7、tcp_accept()

當處于監聽的連接與一個新來的連接連接上后,該函數指定的回調函數將被調用。通常在tcp_listen()函數調用之后調用。

功能

指定處于監聽狀態的連接接通后將要調用的回調函數

原型

void tcp_accept(struct tcp_pcb *pcb,

err_t (* accept)(void *arg,

struct tcp_pcb *newpcb,

err_t err))

參數

pcb:指定一個處于監聽狀態的連接

accept:指定連接接通后將要調用的回調函數

返回

8、tcp_connect()

請求參數pcb指定的連接連接到遠程主機,并發送打開連接的最初的SYN段。函數tcp_connect()調用后立即返回,它并不會等待連接一定要正確建立。如果當連接正確建立,那么它會直接調用第四個參數指定的函數(connected參數)。相反地,如果連接不能夠被正確建立,這原因可能是遠程主機拒絕連接,也可能是遠程主機不應答,無論是什么原因,都會調用connected函數來設置相應的參數err

功能

請求指定的連接連接到遠程主機,并發送打開連接的最初的SYN段

原型

err_t tcp_connect(struct tcp_pcb *pcb,

struct ip_addr *ipaddr,

u16_t port,

err_t (* connected)(void *arg,

struct tcp_pcb *tpcb,

err_t err))

參數

pcb:指定一個連接(pcb)

ipaddr: 指定連接遠程主機的IP地址

port: 指定連接遠程主機的端口號

connected:指定連接正確建立后調用的回調函數

返回

ERR_MEM:當訪問SYN段的內存不可用時,即連接沒有成功建立

ERR_OK: 當SYN被正確地訪問時,即連接成功建立

9、tcp_write()

該函數功能是發送TCP數據,但是并不是一經調用,就立即發送數據,而是將指定的數據放入到發送隊列,由協議內核來決定發送。發送隊列中可用字節的大小可以通過函數tcp_sndbuf()來重新獲得。使用這個函數的一個比較恰當的方法是以函數tcp_sndbuf()返回的字節大小來發送數據。如果函數返回ERR_MEM,則應用程序就等待一會,直到當前發送隊列中的數據被遠程主機成功地接收,然后在嘗試發送下一個數據

功能

發送TCP數據

原型

err_t tcp_write(struct tcp_pcb *pcb,

void *dataptr,

u16_t len,

u8_t copy)

參數

pcb:指定所要發送的連接(pcb)

dataptr:是一個指針,它指向準備發送的數據

len: 指定要發送數據的長度

copy: 這是一個邏輯變量,它為0或者1,它指定是否分配新的內存空間,而把要發送的數

據復制進去。如果該參數為0,則不會為發送的數據分配新的內存空間,因而對發送

數據的訪問只能通過指定的指針

返回

ERR_MEM:如果數據的長度超過了當前發送數據緩沖區的大小或者將要發送的段隊列的

長度超過了文件lwipopts.h中定義的上限(即最大值),則函數tcp_write()調用失

敗,返回ERR_MEM

ERR_OK:數據被正確地放入到發送隊列中,返回ERR_OK

10、tcp_sent()

該函數用于設定遠程主機成功接收到數據后調用的回調函數,通常也在函數tcp_listen()之后調用。

功能

指定當遠程主機成功地接收到數據后,應用程序調用的回調函數

原型

void tcp_sent(struct tcp_pcb *pcb,

err_t (* sent)(void *arg,

struct tcp_pcb *tpcb,

u16_t len))

參數

pcb: 指定一個與遠程主機相連接的連接(pcb)

sent: 指定遠程主機成功地接收到數據后調用的回調函數?!發en”作為參數傳遞給回調函數,

給出上一次已經被確認的發送的最大字節數。

返回

11、tcp_recv()

該函數用于指定當有新的數據接收到時調用的回調函數,通常在函數tcp_accept()指定的回調函數中調用。

功能

指定當新的數據接收到時調用的回調函數

原型

void tcp_recv (struct tcp_pcb *pcb,

err_t (* recv)(void *arg,

struct tcp_pcb *tpcb,

struct pbuf *p,

err_t err))

參數

pcb: 指定一個與遠程主機相連接的連接(pcb)

recv: 指定當新的數據接收到時調用的回調函數。該回調函數可以通過傳遞一個NULL的

pbuf結構用來指示遠程主機已經關閉連接。如果沒有錯誤發生,則回調函數返回

ERR_OK,并且必須釋放掉pbuf結構。否則,如果函數的調用中發生錯誤,那么千

萬不要釋放該結構,以便LwIP內核可以保存該結構,從而等待以后處理。

返回

12、tcp_recved()

當應用程序接收到數據的時候該函數必須被調用,用于獲取接收到的數據的長度,即該函數應該在函數tcp_recv()指定的回調函數中調用。

功能

獲取接收到的數據的長度

原型

void tcp_recved(struct tcp_pcb *pcb, u16_t len)

參數

pcb: 指定一個與遠程主機相連接的連接(pcb)

len:獲取接收到的數據的長度

返回

13、tcp_poll()

當使用LwIP的輪詢功能時必須調用該函數,用于指定輪詢的時間間隔及輪詢時應該調用的回調函數

功能

指定輪詢的時間間隔以及輪詢應用程序時應該調用的回調函數

原型

void tcp_poll(struct tcp_pcb *pcb,

err_t (* poll)(void *arg, struct tcp_pcb *tpcb),

u8_t interval)

參數

pcb:指定一個連接(pcb)

poll: 指定輪詢應用程序時應該調用的回調函數

interval:指定輪詢的時間間隔。時間間隔應該以TCP的細粒度定時器為單位,典型的設置

是每秒鐘兩次。把參數“interval”設置為10意味著應用程序將每5秒鐘輪詢一次。

返回

14、tcp_close()

功能

關閉一個指定的TCP連接,調用該函數后,TCP代碼將會釋放(刪除)pcb結構

原型

err_t tcp_close(struct tcp_pcb *pcb)

參數

pcb: 指定一個需要關閉的連接(pcb)

返回

ERR_MEM:當需要關閉的連接沒有可用的內存時,該函數返回ERR_MEM。如果這樣的

話,應用程序將通過事先確立的回調函數或者是輪詢功能來等待及重新關閉連接

ERR_OK:連接正常關閉。

15、tcp_abort()

該函數通過向遠程主機發送一個RST(復位)段來中止連接。pcb結構將會被釋放。該函數是不會失敗的,它一定能完成中止的目的。如果連接是因為一個錯誤而產生了中止,則應用程序會通過回調函數靈敏地處理這個事件。通常發送錯誤而引起的連接中止都是因為內存資源短缺引起的。設置處理錯誤的回調函數是通過函數tcp_err()來完成。

功能

中止一個指定的連接(pcb)

原型

void tcp_abort(struct tcp_pcb *pcb)

參數

pcb: 指定一個需要關閉的連接(pcb)

返回

16、tcp_err()

該函數用于指定處理錯誤的回調函數。一個可靠的優秀的應用程序一般都要處理可能出現的錯誤,如內存不可用等,這就需要調用該函數來指定一個回調函數來獲取錯誤信息

功能

指定處理錯誤的回調函數

原型

void tcp_err(struct tcp_pcb *pcb,

void (* err)(void *arg, err_t err))

參數

pcb: 指定需要處理的發送錯誤的連接(pcb)

err: 指定發送錯誤時調用的回調函數。因為pcb結構可能已經被刪除了,所以在處理錯誤

的回調函數中pcb參數不可能傳遞進來。

返回

02、UDP相關API

 1、udp_new()

該函數用于建立一個用于UDP通信的UDP控制塊(pcb),但是這個pcb并沒有被激活,除非該pcb已經被綁定到一個本地地址上或者連接到一個固定地址的遠程主機。在定義一個udp_pcb控制塊后該函數應該首先被調用,以建立該控制塊的連接標志

功能

建立一個用于UDP通信的UDP控制塊(pcb)

原型

struct udp_pcb *udp_new(void)

參數

返回

udp_pcb:建立的UDP連接的控制塊(pcb)

2、udp_remove()

該函數用于刪除一個指定的連接,通常是控制塊在建立成功后,即在函數udp_new()調用之后,當不需要該網絡連接來通信了,就需要將其刪除,以釋放該連接(pcb)所占用的資源。

功能

刪除并釋放掉一個udp_pcb

原型

void udp_remove(struct udp_pcb *pcb)

參數

pcb:指定要刪除的連接(pcb)

返回

3、udp_bind()

該函數用戶綁定本地的IP地址和端口號,用戶可以將其綁定在一個任意的本地IP地址上,它也只能在函數udp_new()調用之后才能調用

功能

為指定的連接綁定本地IP地址和端口號

原型

err_t udp_bind(struct udp_pcb *pcb,

struct ip_addr *ipaddr,

u16_t port)

參數

pcb:指定一個連接(pcb)

ipaddr:綁定的本地IP地址。如果為IP_ADDR_ANY,則將連接綁定到所有的本地IP地址上

port: 綁定的本地端口號。注意:千萬不要和其它的應用程序產生沖突

返回

ERR_OK:正確地綁定了指定的連接

ERR_USE: 指定的端口號已經綁定了一個連接,產生了沖突

4、udp_connect()

該函數將一個指定的連接(pcb)連接到遠程主機。由于UDP通信是面向無連接的,所以這不會參數任何的網絡流量(網絡數據收發),它僅僅是設置了一個遠程連接的IP地址和端口號。

功能

將參數“pcb”指定的連接控制塊連接到遠程主機

原型

err_t udp_connect(struct udp_pcb *pcb,

struct ip_addr *ipaddr,

u16_t port)

參數

pcb:指定一個連接(pcb)

ipaddr:設置連接的遠程主機IP地址

port: 設置連接的遠程主機端口號

返回

ERR_OK:正確連接到遠程主機

其它值: LwIP的一些錯誤代碼標志,表示連接沒有正確建立

5、udp_disconnect()

該函數關閉參數“pcb”指定的連接,同函數udp_connect()作用相反。由于UDP通信是面向無連接的,所以這個函數同樣不會參數任何的網絡流量((網絡數據收發),它僅僅是刪除了遠程連接的地址

功能

關閉參數“pcb”指定的連接, 同函數udp_connect()作用相反

原型

void udp_disconnect(struct udp_pcb *pcb)

參數

pcb:指定要刪除的連接(pcb)

返回

6、udp_send()

該函數使用UDP協議發送pbufp指向的數據。在需要發送數據時調用,發送后,該pbuf結構并沒有被釋放。調用該函數后,數據包將被發送到存放在pcb中的當前指定的IP地址和端口號上。如果該pcb沒有連接到一個固定的端口號,那么該函數將會自動隨機地分配一個端口號,并將數據包發送出去。通常,在調用前都會先調用函數udp_connect()

功能

使用UDP協議發送pbuf p指向的數據

原型

err_t udp_send(struct udp_pcb *pcb, struct pbuf *p)

參數

pcb:指定發送數據的連接(pcb)

p: 包含需要發送數據的pbuf鏈

返回

ERR_OK:數據包成功發送,沒有任何錯誤發生

ERR_MEM:內存不可用

ERR_RTE:不能找到到達遠程主機的路由

其它值:其它的一些錯誤碼,都表示發送了錯誤

7、udp_sendto()

該函數同udp_send()作用一樣,但是它指定了發送的目的主機IP地址和端口號,相當于udp_connect()和函數udp_send()合在一起使用的效果。但是,如果在調用該函數前已經調用過函數udp_connect(),那么發送目的主機的IP地址和端口號將以本函數指定的為準,由函數udp_connect()指定的將會被刷新

功能

向具有指定的IP地址和端口號遠程主機發送UDP數據

原型

err_t udp_sendto(struct udp_pcb *pcb,

struct pbuf *p,

struct ip_addr *dst_ip,

u16_t dst_port)

參數

pcb:指定發送數據的連接(pcb)

p: 包含需要發送數據的pbuf鏈

dst_ip:發送數據的遠程主機IP地址

dst_port:發送數據的遠程主機端口號

返回

同函數udp_send()的返回值一樣

8、udp_recv()

該函數用于指定當有新的UDP數據接收到時被調用的回調函數,回調函數將的參數將傳遞進遠程主機的IP地址、端口號及接收到的數據等信息

功能

指定一個接收到UDP數據包時被調用的回調函數

原型

void udp_recv(struct udp_pcb *pcb,

void (* recv)(void *arg,

struct udp_pcb *upcb,

struct pbuf *p,

struct ip_addr *addr,

u16_t port),

void *recv_arg)

參數

pcb:指定一個連接(pcb)

recv: 指定數據包接收到時的回調函數

recv_arg:傳遞給回調函數的參數

返回

感謝各位的閱讀!關于“lwip中TCP和UDP的API有哪些”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女