在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何理解TCP客戶端通信

單片機愛好者 ? 2019-09-17 09:07 ? 次閱讀

上一節(jié)說了UDP,這一節(jié)就聊聊TCP,畢竟它倆經(jīng)常同時出現(xiàn)。優(yōu)缺點上一節(jié)也提了一下:安全性好,速度慢。

除了這兩點,還有就是:

TCP通信之前是需要建立連接的,如同打電話之前先撥號一樣,而UDP無連接;

TCP只能一對一通信,UDP不止一對一,還支持一對多;

TCP對系統(tǒng)資源要求更多,UDP相對少一些。

所以兩者各有優(yōu)缺點,大家在選擇通信協(xié)議的時候一定要根據(jù)自己的實際情況來確定。

然后就是客戶端,這是啥?和它伴隨的,還有一個詞經(jīng)常出現(xiàn),就是:服務(wù)器端。這兩者又是什么關(guān)系?

基本上,這兩者在TCP通信過程中,都是結(jié)伴出現(xiàn)的。以瀏覽器為例,它就是一個客戶端,當我們想上網(wǎng)的時候,輸入一個網(wǎng)址。瀏覽器會根據(jù)我們輸入的網(wǎng)址向相應的服務(wù)器端發(fā)出請求,然后服務(wù)器端返回相應的網(wǎng)頁給瀏覽器。這就是它們的應用場景之一。

所以,在TCP通信過程中,一般都是由客戶端發(fā)起請求,服務(wù)器端相應請求。

那么,在windows/linux下,是如何進行這方面的編程的?步驟如下(參考百度):

TCP編程的服務(wù)器端一般步驟是:

1、創(chuàng)建一個socket,用函數(shù)socket();

2、設(shè)置socket屬性,用函數(shù)setsockopt(); * 可選

3、綁定IP地址、端口信息到socket上,用函數(shù)bind();

4、開啟監(jiān)聽,用函數(shù)listen();

5、接收客戶端上來的連接,用函數(shù)accept();

6、收發(fā)數(shù)據(jù),用函數(shù)send()和recv(),或者read()和write();

7、關(guān)閉網(wǎng)絡(luò)連接;

8、關(guān)閉監(jiān)聽;

TCP編程的客戶端一般步驟是:

1、創(chuàng)建一個socket,用函數(shù)socket();

2、設(shè)置socket屬性,用函數(shù)setsockopt();* 可選

3、綁定IP地址、端口等信息到socket上,用函數(shù)bind();* 可選

4、設(shè)置要連接的對方的IP地址和端口等屬性;

5、連接服務(wù)器,用函數(shù)connect();

6、收發(fā)數(shù)據(jù),用函數(shù)send()和recv(),或者read()和write();

7、關(guān)閉網(wǎng)絡(luò)連接;

可以看到,從第四步開始,客戶端和服務(wù)器端的工作內(nèi)容有了不一樣。

socket是啥?

簡單來說,是個函數(shù),用來創(chuàng)建套接字。

那么,套接字又是什么鬼?

為了防止本篇日志閑扯太多,我盡量簡單說,根據(jù)字面意思,socket字面意思是(電源)插座,而套接字本質(zhì)上是一種網(wǎng)絡(luò)編程接口,用來完成兩個應用程序之間的數(shù)據(jù)傳輸。你把設(shè)備插頭插到電源插座上,設(shè)備通上電了,同理,你把應用程序的端口插到socket里,數(shù)據(jù)就通上了。

注:因為本人是硬件出身,所以對這些協(xié)議的理解全靠百度和工作積累,如果有表達錯誤的,歡迎指正。

這一節(jié)先在8266上面寫一個客戶端的程序,咱們看一下實現(xiàn)的效果。跟上一節(jié)一樣,還是要借助一個網(wǎng)絡(luò)調(diào)試助手。同時,本節(jié)代碼都是在上一節(jié)基礎(chǔ)上修改來的,所以,如果上一節(jié)看懂了,這一節(jié)就很好理解,反之,你懂的~

先說步驟,依然很多,參考上面提到的“TCP編程的客戶端一般步驟”,這里大致分為7步:

1 包含頭文件

#include "espconn.h"

#include "mem.h"

主要是"espconn.h",涉及到TCP通訊所需的各種數(shù)據(jù)結(jié)構(gòu)。上一節(jié)已經(jīng)包含了,可以略過。

2 設(shè)置工作模式為station+ soft-ap模式,連接到當前環(huán)境下的wifi

因為前幾步跟上一節(jié)一模一樣,所以整合了一下:

wifi_set_opmode(0x03); // station+ soft-ap模式

struct softap_config config; //定義AP參數(shù)結(jié)構(gòu)體,

wifi_softap_get_config(&config); //獲取當前AP模式的參數(shù)

os_memcpy(config.ssid,"ESP8266",strlen("ESP8266"));

//修改AP名稱

os_memcpy(config.password,"123456789",strlen("123456789"));

//修改AP密碼

config.ssid_len=strlen("ESP8266"); //修改 AP名稱的長度

wifi_softap_set_config(&config); //使修改后的參數(shù)生效

然后連到我家wifi,你們要改成你們家里或者辦公室里的wifi。

3 確定TCP連接的參數(shù)

這里要確定幾點:你是誰?你要和誰連接?連接的端口是多少?

你是誰——ESP8266,8266連接家里路由成功之后,會自動獲得一個IP,這是客戶端IP

你要和誰連接——因為是在我電腦上使用網(wǎng)絡(luò)調(diào)試助手模擬TCP服務(wù)器端,所以服務(wù)器端的IP是我電腦的IP:192.168.1.103

連接的端口——長話短說,TCP連接的端口從0到65535都有,但一般0~1023是公有的,從1024開始往后,可以選為自己的端口。這里選1024.

struct ip_info info;

const char remote_ip[4]={192,168,1,103}; //TCP服務(wù)端IP

wifi_get_ip_info(STATION_IF,&info); //獲取8266的WIFI信息

tcp_client_init((struct ip_addr *)remote_ip,&info.ip,1024);

4 TCP客戶端初始化

其實就是第三步里面的tcp_client_init函數(shù),咱們主要看一下函數(shù)內(nèi)部實現(xiàn)的功能。首先是在client.h文件中定義了一個espconn格式的結(jié)構(gòu)體:

struct espconn user_tcp_conn; //對應網(wǎng)絡(luò)連接的結(jié)構(gòu)體

然后在tcp_client_init函數(shù)中,對結(jié)構(gòu)體的各個部分進行配置:

{

//TCP通信時,對應的espconn參數(shù)配置

user_tcp_conn.type=ESPCONN_TCP;

user_tcp_conn.state=ESPCONN_NONE;

user_tcp_conn.proto.tcp=(esp_tcp *)os_zalloc(sizeof(esp_tcp));

os_memcpy(user_tcp_conn.proto.tcp->local_ip,local_ip,4);

os_memcpy(user_tcp_conn.proto.tcp->remote_ip,remote_ip,4);

user_tcp_conn.proto.tcp->local_port=espconn_port();

user_tcp_conn.proto.tcp->remote_port=remote_port;

//注冊連接回調(diào)函數(shù)和重連回調(diào)函數(shù)

espconn_regist_connectcb(&user_tcp_conn,user_tcp_connect_cb);

espconn_regist_reconcb(&user_tcp_conn,user_tcp_recon_cb);

//啟用連接

espconn_connect(&user_tcp_conn);

}

函數(shù)中可以看到,espconn的參數(shù)設(shè)置完成之后,注冊了兩個回調(diào)函數(shù),連接完成回調(diào)函數(shù)(連接完成以后,你想干嘛?)和重連回調(diào)函數(shù)(重連的時候,該咋辦?):

espconn_regist_connectcb(&user_tcp_conn,user_tcp_connect_cb);

espconn_regist_reconcb(&user_tcp_conn,user_tcp_recon_cb);

最后,開始TCP連接:

espconn_connect(&user_tcp_conn); //連接TCP server,連接成功返回0.

5 定義連接成功的回調(diào)函數(shù)

void ICACHE_FLASH_ATTR user_tcp_connect_cb(void *arg){

struct espconn *pespconn=arg;

espconn_regist_recvcb(pespconn,user_tcp_recv_cb);

espconn_regist_sentcb(pespconn,user_tcp_sent_cb);

espconn_regist_disconcb(pespconn,user_tcp_discon_cb);

espconn_sent(pespconn,"hello,this is esp8266!",strlen("hello,this is esp8266!"));

}

函數(shù)內(nèi)部進行了幾個操作:

注冊接收完成的回調(diào)函數(shù):接收完成以后,你想做點啥~

注冊發(fā)送完成的回調(diào)函數(shù):發(fā)送完成以后,你想做點啥~

注冊斷開TCP連接的回調(diào)函數(shù):斷開TCP連接以后,你想做點啥~

TCP連接下,發(fā)送數(shù)據(jù):hello,this is esp8266!

6 定義user_tcp_connect_cb函數(shù)內(nèi)部注冊的回調(diào)函數(shù)

這里先說一下,基本上從上一節(jié)開始,代碼的編寫就進入了回調(diào)函數(shù)套回調(diào)函數(shù)的情形。如果是沒接觸過回調(diào)函數(shù)的,剛開始看肯定有些別扭。但如果適應以后,你會發(fā)現(xiàn)這樣操作還是很方便的。

因為每個回調(diào)函數(shù),在手冊里都有說明,功能、參數(shù)、返回值,都很清晰。基本上只要看著手冊和官方SDK里的例程,大部分問題都能解決。

//接收完成回調(diào)函數(shù),把收到的數(shù)據(jù)打印出來,延時,斷開連接

void ICACHE_FLASH_ATTR user_tcp_recv_cb(void *arg,

char *pdata,

unsigned short len){

os_printf("receive data:%s ",pdata);

os_delay_us(300);

espconn_disconnect((struct espconn *)arg);

}

//發(fā)送完成回調(diào)函數(shù),打印發(fā)送完成標志

void ICACHE_FLASH_ATTR user_tcp_sent_cb(void *arg){

os_printf("send success!");

}

//斷開TCP連接的回調(diào)函數(shù),打印相關(guān)信息

void ICACHE_FLASH_ATTR user_tcp_discon_cb(void *arg){

os_printf("disconnect success!");

}

7 定義TCP重連的回調(diào)函數(shù)

在第4步里注冊了兩個回調(diào)函數(shù),一個是連接成功的回調(diào)函數(shù),第5步已經(jīng)說了。另一個就是重連的回調(diào)函數(shù):

//如果連接錯誤,打印一下故障碼,然后重新連接

void ICACHE_FLASH_ATTR user_tcp_recon_cb(void *arg, sint8 err){

os_printf("error,error code is%d ",err);

espconn_connect((struct espconn *)arg);

}

好,到此為止,程序修改完畢。

注:本例程里提到的大部分函數(shù),都參照手冊2c-esp8266_sdk_api_guide_cn_v1.5.4。

再說一點,很多函數(shù)定義的時候,后面會跟一個參數(shù):void *arg,這是什么?

以第5步里注冊回調(diào)函數(shù)為例:

espconn_regist_recvcb(pespconn,user_tcp_recv_cb);

注冊了user_tcp_recv_cb函數(shù),這個函數(shù)在定義的時候就有如下幾個參數(shù)

(void *arg,char *pdata,unsigned short len)

從哪來的?

打開手冊2c-esp8266_sdk_api_guide_cn_v1.5.4,查找espconn_regist_recvcb函數(shù),可以看到如下說明;

根據(jù)其中的espconn_recv_callback,咱們繼續(xù)向下找:

至此,可以看到相關(guān)參數(shù)已經(jīng)在回調(diào)函數(shù)的格式里定義好了,咱們只需要照著寫就行。

程序修改完成,保存、清理、編譯、下載一條龍,然后重新上電。這里,需要借助串口助手和網(wǎng)絡(luò)調(diào)試助手兩個工具來查看效果。效果如下所示:

設(shè)置網(wǎng)絡(luò)調(diào)試助手:

可以看到,在網(wǎng)絡(luò)調(diào)試助手上,分別顯示了client上線的時間和發(fā)來的數(shù)據(jù)。如果這時候咱們手動給client發(fā)一個數(shù)據(jù):mcu lover。

可以在串口助手上看到:

顯示了收到的數(shù)據(jù),最后斷開TCP連接。

至此,TCP客戶端通信說完了。還是希望大家多動手,畢竟這類東西要動手才有收獲。后面會說一下TCP服務(wù)器端的用法(跟這個差不多),然后是POST和GET的用法,再然后,就可以根據(jù)GET,搞一個天氣預報的小應用,相信很多人會比較感興趣。

最后嘮叨一下,這篇日志寫的比較痛苦,因為我是從一個硬件工程師的視角去說這些東西,所以希望跟我類似的人能比較好的理解日志中出現(xiàn)的這些網(wǎng)絡(luò)協(xié)議。因為通常來說,搞硬件的就是搞硬件,畫畫PCB、搞搞焊接、給單片機寫寫程序,甚至再寫一寫上位機,在linux下寫一些應用。至于說整天研究TCP/UDP,或者POST、GET,比較少,或者說不算硬件工程師/單片機工程師的范疇了。

但是物聯(lián)網(wǎng)芯片的出現(xiàn)打破了這一屏障,它小巧,單片機級別的資源就能使用;但它又強大,可以聯(lián)網(wǎng),實現(xiàn)各種網(wǎng)絡(luò)通信。所以,我們要不停的學習,千萬不要自我滿足。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • TCP
    TCP
    +關(guān)注

    關(guān)注

    8

    文章

    1353

    瀏覽量

    79074
  • TCP通信
    +關(guān)注

    關(guān)注

    0

    文章

    146

    瀏覽量

    4223

原文標題:ESP8266_12 ESP8266客戶端模式下的TCP通信

文章出處:【微信號:gh_dae0718828df,微信公眾號:gh_dae0718828df】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    Linux網(wǎng)絡(luò)編程-TCP客戶端如何獲取要連接的服務(wù)IP?

    本篇介紹了在TCP通信中,客戶端通過UDP廣播,實現(xiàn)自動獲取服務(wù)的IP地址,并進行TCP連接的具體方法,并通過代碼實現(xiàn),來測試此方案是實際
    的頭像 發(fā)表于 09-27 08:56 ?3688次閱讀
    Linux網(wǎng)絡(luò)編程-<b class='flag-5'>TCP</b><b class='flag-5'>客戶端</b>如何獲取要連接的服務(wù)<b class='flag-5'>端</b>IP?

    如何同時在ESP8266上運行TCP客戶端TCP服務(wù)?

    我們是 esp8266 的長期用戶,并在該芯片上運行數(shù)千臺家庭自動化類別的現(xiàn)場設(shè)備。然而,一個小小的限制阻礙了我們開發(fā)一些更有趣和創(chuàng)新的產(chǎn)品。 要求:我們需要同時運行 TCP 客戶端(連接
    發(fā)表于 07-08 08:26

    labview TCP客戶端

    最近在做一個labview 客戶端測試小程序,服務(wù)器采用MFC編寫,客戶端采用TCP偵聽函數(shù),通信可以連接,數(shù)據(jù)也正確,但是服務(wù)器檢測發(fā)送
    發(fā)表于 06-30 23:15

    【NanoPi NEO試用體驗】TCP通信客戶端程序

    寫了一個TCP通信客戶端程序,匆忙之間寫的,不夠完善,可以圍觀,給出精辟的見解。百度百科TCP/IP介紹:http://baike.baidu.com/link?url
    發(fā)表于 12-28 23:40

    TCP通信時服務(wù)如何接收客戶端的數(shù)據(jù)?

    畢設(shè)采用的是TCP協(xié)議,組員做的是下位機,C編程,WiFi模塊工作處于客戶端。我負責上位機,Labview使用tcp協(xié)議時服務(wù)怎么接收客戶端
    發(fā)表于 04-14 14:49

    基于Socket開發(fā)TCP傳輸客戶端

    1 程序界面設(shè)計 TCP客戶端在上位機開發(fā)中應用很廣,大多數(shù)情況下,上位機軟件都是作為一個TCP客戶端來與PLC或其他服務(wù)器進行通信的。
    發(fā)表于 07-02 06:33

    stm32f107vc lwip tcp客戶端

    stm32f107vc lwip tcp客戶端 服務(wù)器數(shù)據(jù)傳輸?shù)谝黄?b class='flag-5'>TCP客戶端模式簡單數(shù)據(jù)收發(fā) ----控制開發(fā)板LED燈概要建立LWIP客戶端
    發(fā)表于 08-06 09:17

    當WiFi信號變低時,服務(wù)器和客戶端之間的TCP通信丟失,如何使客戶端重新連接?

    大家好, 當 WiFi 信號變低時,服務(wù)器和客戶端之間的 TCP 通信丟失,比如超過 -80dBm。一旦客戶端斷開連接,它就無法重新連接并正常進行
    發(fā)表于 05-15 07:31

    服務(wù)器和客戶端之間的TCP通信丟失怎么處理?

    嗨, 當 WiFi 信號變低時,比如超過 -80dBm,我面臨服務(wù)器和客戶端之間的 TCP 通信丟失。一旦客戶端斷開連接,它就無法重新連接并正常進行
    發(fā)表于 05-16 08:19

    JAVA教程之TCP客戶端

    JAVA教程之TCP客戶端,很好的JAVA的資料,快來學習吧
    發(fā)表于 04-11 17:28 ?7次下載

    TCP回響客戶端:RAW API接口

    TCP回響客戶端例程(RAW API)
    的頭像 發(fā)表于 07-05 00:31 ?3939次閱讀
    <b class='flag-5'>TCP</b>回響<b class='flag-5'>客戶端</b>:RAW API接口

    網(wǎng)絡(luò)調(diào)試和串口調(diào)試集合UDP TCP客戶端TCP服務(wù)器應用程序免費下載

    本文檔的主要內(nèi)容詳細介紹的是網(wǎng)絡(luò)調(diào)試和串口調(diào)試集合UDP TCP客戶端TCP服務(wù)器應用程序免費下載。
    發(fā)表于 08-30 08:00 ?16次下載
    網(wǎng)絡(luò)調(diào)試和串口調(diào)試集合UDP <b class='flag-5'>TCP</b><b class='flag-5'>客戶端</b>和<b class='flag-5'>TCP</b>服務(wù)器<b class='flag-5'>端</b>應用程序免費下載

    Linux下網(wǎng)絡(luò)編程TCP并發(fā)服務(wù)器和TCP客戶端程序免費下載

    本文檔的主要內(nèi)容詳細介紹的是Linux下網(wǎng)絡(luò)編程TCP并發(fā)服務(wù)器和TCP客戶端程序免費下載
    發(fā)表于 01-08 15:12 ?9次下載
    Linux下網(wǎng)絡(luò)編程<b class='flag-5'>TCP</b>并發(fā)服務(wù)器和<b class='flag-5'>TCP</b><b class='flag-5'>客戶端</b>程序免費下載

    Linux下TCP網(wǎng)絡(luò)編程-創(chuàng)建服務(wù)器與客戶端

    這篇文章介紹在Linux下的socket編程,完成TCP服務(wù)器、客戶端的創(chuàng)建,實現(xiàn)數(shù)據(jù)通信
    的頭像 發(fā)表于 08-14 09:26 ?2498次閱讀
    Linux下<b class='flag-5'>TCP</b>網(wǎng)絡(luò)編程-創(chuàng)建服務(wù)器與<b class='flag-5'>客戶端</b>

    基于LwIP的TCP客戶端設(shè)計

    上一篇我們基于LwIP協(xié)議棧的RAW API實現(xiàn)了一個TCP服務(wù)器的簡單應用,接下來一節(jié)我們來實現(xiàn)一個TCP客戶端的簡單應用。
    的頭像 發(fā)表于 12-14 15:12 ?2283次閱讀
    基于LwIP的<b class='flag-5'>TCP</b><b class='flag-5'>客戶端</b>設(shè)計
    主站蜘蛛池模板: 日本污视频在线观看| 天堂中文资源在线地址| ccav在线永久免费看| 婷婷 夜夜| 久久精品国产亚洲综合色| 亚洲第一区第二区| 亚洲色妞| 热99精品| 欧美成人eee在线| 俄罗斯女人69xxx| q2002在线观看免费| 天天摸天天碰天天碰| 在线高清视频大全| 亚洲成人午夜影院| 1024成人| 丁香六月在线| 伊人网址| 狠狠干.com| 久草男人天堂| 欧美天天射| 色天天综合色天天看| 国产天天色| 亚洲成网站| 亚洲欧美高清| 日本.www| 波多野结衣在线观看一区二区 | 主人扒开腿揉捏花蒂调教cfh| kkk4444免费观看| 高h上错人1v1| 在线精品国产三级| 国产男女交性视频播放免费bd| 一级做a爱免费观看视频| 日本三级人妇| 成人丁香婷婷| 久热首页| 亚洲一区亚洲二区| 男生女生靠逼视频| 天天色成人网| 无内丝袜透明在线播放| 经典三级一区二区三区视频| 国产乱码免费卡1卡二卡3卡四|