RAW 編程接口 TCP 簡介

一、LWIP 中 中 RAW API ?編程接口中與 TCP ?相關的函數

二、LWIP TCP RAW API 函數

三、LwIP_Periodic_Handle函數

LwIP_Periodic_Handle 函數是一個必須被無限循環調用的 LwIP支持函數,一般在 main函數的無限循環中調用,主要功能是為 LwIP各個模塊提供時間并查詢鏈路狀態,該 函數有一個形參,用于指示當前時間,單位為 ms。 對于 TCP功能,每 250ms執行一次 tcp_tmr函數;對于 ARP,每 5s 執 行一次 etharp_tmr函數;對于鏈路狀態檢測,每 1s 執行一次ETH_CheckLinkStatus 函數; 對于 DHCP功能,每 500ms執行一次 dhcp_fine_tmr函數,如果 DHCP處于DHCP_START 或 DHCP_WAIT_ADDRESS 狀態就執行LwIP_DHCP_Process_Handle 函數,對于 DHCP功 能,還有每 60s 執行一次 dhcp_coarse_tmr函數。

四、TCP客戶端連接代碼

tcpclinet.c

#include "lwip/netif.h"
#include "lwip/ip.h"
#include "lwip/tcp.h"
#include "lwip/init.h"
#include "netif/etharp.h"
#include "lwip/udp.h"
#include "lwip/pbuf.h"
#include <stdio.h>	
#include <string.h>
#include "main.h"static void client_err(void *arg, err_t err)       //出現錯誤時調用這個函數,打印錯誤信息,并嘗試重新連接
{printf("連接錯誤!!\n");printf("嘗試重連!!\n");printf("重新初始化客戶端\n");TCP_Client_Init();
}static err_t client_send(void *arg, struct tcp_pcb *tpcb)   //發送函數,調用了tcp_write函數
{uint8_t send_buf[]= "我是客戶端,是你的好哥哥\n";//發送數據到服務器tcp_write(tpcb, send_buf, sizeof(send_buf), 1); return ERR_OK;
}static err_t client_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{if (p != NULL) {        /* 接收數據*/tcp_recved(tpcb, p->tot_len);/* 返回接收到的數據*/  tcp_write(tpcb, p->payload, p->tot_len, 1);memset(p->payload, 0 , p->tot_len);pbuf_free(p);} else if (err == ERR_OK) {//服務器斷開連接printf("服務器斷開連接!\n");tcp_close(tpcb);//重新連接TCP_Client_Init();}return ERR_OK;
}static err_t client_connected(void *arg, struct tcp_pcb *pcb, err_t err)
{printf("connected ok!\n");//注冊一個周期性回調函數tcp_poll(pcb,client_send,2);//注冊一個接收函數tcp_recv(pcb,client_recv);return ERR_OK;
}void TCP_Client_Init(void)
{        struct tcp_pcb *client_pcb = NULL;   //這一句一定要放在里面,否則會沒用ip4_addr_t server_ip;     //因為客戶端要主動去連接服務器,所以要知道服務器的IP地址/* 創建一個TCP控制塊  */client_pcb = tcp_new();	  IP4_ADDR(&server_ip, DEST_IP_ADDR0,DEST_IP_ADDR1,DEST_IP_ADDR2,DEST_IP_ADDR3);//合并IP地址printf("客戶端開始連接!\n");//開始連接tcp_connect(client_pcb, &server_ip, TCP_CLIENT_PORT, client_connected);ip_set_option(client_pcb, SOF_KEEPALIVE);	printf("已經調用了tcp_connect函數\n");//注冊異常處理tcp_err(client_pcb, client_err);printf("已經注冊異常處理函數\n");	
}

tcpclinet.h?

#ifndef _TCPCLIENT_H_
#define _TCPCLIENT_H_#define TCP_CLIENT_PORT 5001void TCP_Client_Init(void);#endif

五、TCP服務器連接代碼

tcpserver.c

#include "tcpserver.h"
#include "lwip/netif.h"
#include "lwip/ip.h"
#include "lwip/tcp.h"
#include "lwip/init.h"
#include "netif/etharp.h"
#include "lwip/udp.h"
#include "lwip/pbuf.h"
#include <stdio.h>	
#include <string.h>static err_t tcpecho_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{                                   //對應接收數據連接的控制塊   接收到的數據   if (p != NULL) {        //int a = 666;/* 更新窗口*/tcp_recved(tpcb, p->tot_len);     //讀取數據的控制塊   得到所有數據的長度   /* 返回接收到的數據*/  //tcp_write(tpcb, p->payload, p->tot_len, 1);uint8_t send_buf1[]= "我收到了你的信息!是";uint8_t send_buf2[]= "嗎?\n";	tcp_write(tpcb, send_buf1, sizeof(send_buf1), 1);tcp_write(tpcb, p->payload, p->tot_len, 1);	tcp_write(tpcb, send_buf2, sizeof(send_buf2), 1);	memset(p->payload, 0 , p->tot_len);pbuf_free(p);} else if (err == ERR_OK)    //檢測到對方主動關閉連接時,也會調用recv函數,此時p為空{return tcp_close(tpcb);}return ERR_OK;
}static err_t tcpecho_accept(void *arg, struct tcp_pcb *newpcb, err_t err) //由于這個函數是*tcp_accept_fn類型的//形參的數量和類型必須一致
{     tcp_recv(newpcb, tcpecho_recv);    //當收到數據時,回調用戶自己寫的tcpecho_recvreturn ERR_OK;
}void TCP_Echo_Init(void)
{struct tcp_pcb *server_pcb = NULL;	            		/* 創建一個TCP控制塊  */server_pcb = tcp_new();	printf("創建了一個控制塊\n");/* 綁定TCP控制塊 */tcp_bind(server_pcb, IP_ADDR_ANY, TCP_ECHO_PORT);       printf("已經綁定一個控制塊\n");/* 進入監聽狀態 */server_pcb = tcp_listen(server_pcb);printf("進入監聽狀態\n");	/* 處理連接 注冊函數,偵聽到連接時被注冊的函數被回調 */	tcp_accept(server_pcb, tcpecho_accept);  //偵聽到連接后,回調用戶編寫的tcpecho_accept //這個函數是*tcp_accept_fn類型的
}

tcpserver.h

#ifndef _TCPECHO_H_
#define _TCPECHO_H_#define TCP_ECHO_PORT 5001void TCP_Echo_Init(void);#endif

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/697215.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/697215.shtml
英文地址,請注明出處:http://en.pswp.cn/news/697215.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

web前端安全性——JSONP劫持

1、JSONP概念 JSONP(JSON with Padding)是JSON的一種“使用模式”&#xff0c;可用于解決主流瀏覽器的跨域數據訪問的問題。由于同源策略&#xff0c;協議IP端口有任意不同都會導致請求跨域&#xff0c;而HTML的script元素是一個例外。利用script元素的這個開放策略&#xff0…

vscode【報錯】yarn : 無法將“yarn”項識別為 cmdlet

問題 CMD下載完yarn可以查看到yarn版本&#xff0c;但是進入到vscode控制臺報錯無法識別&#xff0c;報錯內容如下&#xff1a; vscode【報錯】yarn : 無法將“yarn”項識別為 cmdlet、函數、腳本文件或可運行程序的名稱。請檢查名稱的拼寫&#xff0c;如果包括路徑&#xff…

@ 代碼隨想錄算法訓練營第8周(C語言)|Day57(動態規劃)

代碼隨想錄算法訓練營第8周&#xff08;C語言&#xff09;|Day57&#xff08;動態規劃&#xff09; Day53、動態規劃&#xff08;● 1143.最長公共子序列 ● 1035.不相交的線 ● 53. 最大子序和 動態規劃 &#xff09; 1143.最長公共子序列 題目描述 給定兩個字符串 text1 …

C#面:i++ 和 ++i 的區別

i 先參與左邊的運算&#xff0c;之后 i 自增&#xff1b; int i 5; int result i; // result的值為5&#xff0c;i的值變為6 i i 先自增&#xff0c;之后的值&#xff0c;參與左邊的運算&#xff1b; int i 5; int result i; // result的值為6&#xff0c;i的值也為6…

【一步步由簡入深,搞定FFT,持續更新中...】

作為一個傾向于形象思維的工程師&#xff0c;總想把復雜深奧的知識搞的方便理解&#xff0c;雖然上學時學過數字信號處理&#xff0c;仍然一知半解&#xff0c;現在想借著項目中涉及到的頻譜相關知識總結下來&#xff0c;在了解中逐步完善。 好了&#xff0c;首先要明確的概念是…

ffmpeg for android編譯全過程與遇到的問題

編譯前準備 編譯環境&#xff1a;Ubuntu16&#xff0c;可自行下載VMWare最新版并百度永久許可證或在服務器上安裝Ubuntu ffmpeg源碼&#xff1a;ffmpeg4.2.2 NDK下載&#xff1a;Android NDK r21e 有條件的最好還是在Liunx平臺下編譯吧&#xff0c;Windows平臺下編譯坑更多…

【計算機網絡】數據鏈路層|封裝成幀|透明傳輸|差錯檢測|PPP協議|CSMA/CD協議

目錄 一、思維導圖 ? 二、數據鏈路層功能概述 1.數據鏈路層概述 2.數據鏈路層功能概述——封裝成幀 3.數據鏈路層功能概述——透明傳輸 4.數據鏈路層功能概述——差錯檢測 三、數據鏈路層重要協議 1.數據鏈路層重要協議&#xff1a;PPP協議 2.數據鏈路層重要協議&#x…

js設計模式:備忘錄模式

作用: 封裝的對象可以在對象觸發行為時進行狀態的記錄與保存 也可以進行狀態的回退,恢復之前的狀態 示例: class Editor{constructor(){this.allText }edit(text){this.allText text}saveNow(){return new EditorText(this.allText)}backspacing(editorText){this.allText…

護眼臺燈哪個品牌更好用?五大好用護眼臺燈大爆料!

護眼臺燈相信大家都有所耳聞或者使用過,家里有小孩的可能了解更深,畢竟是孩子學習時需要使用的小家電。現在市面上的護眼臺燈種類可以說是多到眼花繚亂,甚至有些劣質的產品摻雜在里面,或許有些寶媽已經踩過一些坑了&#xff0c;護眼臺燈究竟哪個品牌更好用&#xff1f; &#x…

這個春節,爽了

四次醫院 請了一周假&#xff0c;準備開始愉快的長假。 結果第一天小孩就發燒了&#xff0c;趕緊送醫院拿藥。回到家才發現&#xff0c;給醫生看的驗血報告是上一次的&#xff0c;那是好幾個月之前的。 但是藥已經吃了&#xff0c;這是吃錯藥了呀&#xff01;&#xff01; …

手機中有哪些逆向進化的功能

手機中有哪些逆向進化的功能&#xff1f;逆向進化是指明明很優秀的很方便的功能&#xff0c;卻因為成本或者其他工業原因莫名其妙地給取消了。 逆向進化1&#xff1a;可拆卸電池-變為不可拆卸電池。 智能手機為了追求輕薄等原因&#xff0c;所以移除了可拆卸電池功能。將電池…

GoLand 相關

goland 下載依賴 go mod tidy&#xff1a;保持依賴整潔 go mod tidy 命令的作用是清理未使用的依賴&#xff0c;并更新 go.mod 以及 go.sum 文件。 go mod tidy 和 go mod vendor 兩個命令是維護項目依賴不可或缺的工具。go mod tidy 確保了項目的 go.mod 文件精簡且準確&…

ubuntu20.04安裝實時內核補丁PREEMPT_RT

參考&#xff1a; Ubuntu 18.04安裝 RT-PREEMPT 實時內核及補丁【過程記錄】_ubuntu18.04 preempt rt linux 5.6.19-CSDN博客 https://github.com/UniversalRobots/Universal_Robots_ROS_Driver/blob/master/ur_robot_driver/doc/real_time.md當前內核&#xff1a;5.15.0-94-ge…

1.deeplabv3+網絡結構及原理

這里的網絡結構及原理可以看這篇博客&#xff0c;DeepLabV3: 在DeepLabV3基礎上引入了Decoder_matlab deeplabv3resnet101-CSDN博客該博客翻譯原論文解釋得很清楚。 一、引言 語義分割的目標是為圖像中的每個像素分配語義標簽。在這項研究中&#xff0c;考慮了兩種類型的神經網…

Vue計算屬性computed()

1. 計算屬性定義 獲取計算屬性值 <div>{{ 計算屬性名稱}}</div>創建計算屬性 let 定義的屬性ref/reactive....let 計算屬性名稱 computed(() > {//這里寫函數式,函數式里面包含定義屬性//只有這個包含的定義屬性被修改時才出發此函數式//通過計算屬性名稱co…

docker:Haoop集群

系列文章目錄 docker&#xff1a;環境安裝 docker:Web遷移 docker:Haoop集群 文章目錄 系列文章目錄前言一、宿主機選擇二、環境準備1.前置技術2.網絡環境1. docker網卡2. 分配IP 三、容器互聯三、Jdk和Hadoop安裝四、分發腳本五、啟動Hadoop總結 前言 年前學習了docker的相關…

ubuntu18 環境安裝

1. ubuntu18 環境安裝 1. ubuntu18 環境安裝 1.1. default language1.2. sougou shurufa1.3. cmake-last1.4. audio-recorder1.5. sources.list切換清華源1.6. oh my zsh1.7. weixin1.8. bcompare1.9. wireshark1.10. 其他問題 1.1. default language ubuntu 修改系統默認語…

https://registry.npm.taobao.org淘寶npm鏡像倉庫地址更新

在工作中有遇見獲取淘寶的npm鏡像存在問題&#xff0c;圖示如下的報錯&#xff1a; 根據報錯的內容是說 https://registry.npm.taobao.org地址訪問失敗了&#xff0c;然后通過排查發現淘寶的npm鏡像倉庫地址有更新了。需要使用最新的地址 舊的淘寶鏡像倉庫&#xff1a;https://…

數據結構2月19日

題目&#xff1a;順序表作業 代碼&#xff1a; 功能區&#xff1a; #include <stdio.h>#include <stdlib.h>#include "./d2191.h"SeqList* create_seqList(){SeqList* list (SeqList*)malloc(sizeof(SeqList));if(NULL list){return NULL;}list->p…

Linux系列講解 —— 【Vim編輯器】在Ubuntu18.04中安裝新版Vim

平時用的電腦系統是Ubuntu18.04&#xff0c;使用apt安裝VIM的默認版本是8.0。如果想要安裝新版的Vim編輯器&#xff0c;只能下載Vim源碼后進行編譯安裝。 目錄 1. 下載Vim源碼2. 編譯3. 安裝4. 遇到的問題4.1 打開vim后&#xff0c;文本開頭有亂碼現象。4.2 在Vim編輯器中&…