• 正文
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

Lwip(RAW)TCP服務(wù)器收發(fā)函數(shù)單獨使用

12小時前
255
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

Lwip使用RAW進行TCP 服務(wù)器的數(shù)據(jù)收發(fā)時主要流程如下:

1 tcp_new創(chuàng)建資源

tcp_server_pcb?= tcp_new();

2 tcp_bind綁定信息

tcp_bind(*tcp_server_pcb, ipaddr, port);

3 tcp_listen監(jiān)聽是否有客戶端連接

*tcp_server_pcb = tcp_listen(*tcp_server_pcb);

注意這里listen的參數(shù)和返回值是一樣的,因為tcp_listen這個函數(shù)會申請新的資源并釋放原來的資源。函數(shù)調(diào)用順序和源碼如下:

tcp_listen————>tcp_listen_with_backlog————>tcp_listen_with_backlog_and_err
tcp_listen_with_backlog_and_err(struct?tcp_pcb *pcb,?u8_t?backlog,?err_t?*err){? ...? ...? lpcb = (struct?tcp_pcb_listen *)memp_malloc(MEMP_TCP_PCB_LISTEN);? ...? ...??tcp_free(pcb);? ...? ...??return?(struct?tcp_pcb *)lpcb;}

程序先申請了新的內(nèi)存(memp_malloc),并釋放了原來的資源(tcp_free),并將新的返回(return?(struct?tcp_pcb *)lpcb)。4 tcp_accept

tcp_accept(*tcp_server_pcb, tcp_severXXX_accept)

有客戶端連接后會調(diào)用tcp_serverXXX_accept函數(shù),在這個函數(shù)里注冊之后的處理函數(shù)包括:
注冊參數(shù)函數(shù)tcp_arg注冊接收回調(diào)函數(shù)tcp_recv注冊錯誤回調(diào)函數(shù)tcp_err注冊輪詢函數(shù)tcp_poll注冊發(fā)送回調(diào)函數(shù)tcp_poll同時在這里獲取客戶端的資源塊:

struct?tcp_pcb?*tcp_server_pcb_send;err_t?tcp_severXXX_accept(void?*arg,?struct?tcp_pcb *pcb,?err_t?err){? tcp_server_pcb_send = pcb;????tcp_arg(pcb,&tcp_server0);??tcp_recv(pcb,TCPServerCallback); ?//初始化tcp_recv()的回調(diào)函數(shù)??tcp_err(pcb,tcp_server_error); ?//初始化tcp_err()回調(diào)函數(shù)??tcp_poll(pcb,tcp_server_poll,1); ?//初始化tcp_poll回調(diào)函數(shù)// ?tcp_sent(pcb,tcp_server_sent); ? //初始化發(fā)送回調(diào)函數(shù)??return?ERR_OK; ? ??}

這樣就獲取了連接的客戶端資源塊,可獨立使用。

tcp_write(tcp_server_pcb0_send, sendbufferXXX, lengthXXX, XXX);

這樣就可在別的函數(shù)中獨立發(fā)送數(shù)據(jù)給客戶端。單獨調(diào)用函數(shù)tcp_server_send_data就可以。

void?tcp_server_send_data(struct?tcp_pcb *tpcb,uint8_t?*sendbuffer,uint32_t?length)?{?? ??tcp_write(tpcb, sendbuffer, length,?1);? ??tcp_output(tpcb);}?

相關(guān)推薦