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

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

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

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

【網(wǎng)絡(luò)編程】用于echo回顯測試的TCP服務(wù)器的設(shè)計(jì)

嵌入式物聯(lián)網(wǎng)開發(fā) ? 來源:嵌入式物聯(lián)網(wǎng)開發(fā) ? 作者:嵌入式物聯(lián)網(wǎng)開發(fā) ? 2022-08-31 13:25 ? 次閱讀
筆者在工作中,常常接觸到網(wǎng)絡(luò)通訊相關(guān)的內(nèi)容,經(jīng)常需要著手解決一些網(wǎng)絡(luò)通訊相關(guān)的疑難雜癥。排查網(wǎng)絡(luò)問題的時候,往往需要借助一些工具,而很多時候自己想要的功能,網(wǎng)上又未能找到匹配度高的exe工具。無奈之下,有的時候就不能不自己碼代碼,寫一些【為我所用】的測試代碼,來幫助自己完成問題的排查。

? 本文主要介紹一個TCP服務(wù)器端的測試程序,它的主要功能是:接收TCP客戶端的連接,當(dāng)收到客戶端發(fā)送的消息后,立刻給客戶端回復(fù)收到的消息;這個功能,通俗來講,就叫【回顯】。別看它很簡單,但是在實(shí)際排查網(wǎng)絡(luò)問題時,確實(shí)非常地有效。

? 通過本文的閱讀,你將了解到以下內(nèi)容:

  • TCP客戶端/服務(wù)器代碼邏輯的剖析
  • TCP服務(wù)器端如何獲取客戶端的IP地址和端口信息
  • TCP回顯測試服務(wù)器的使用和驗(yàn)證

? 鑒于筆者主要集中在Linux環(huán)境編程,以下所有講解都是基于Linux環(huán)境;如在Windows環(huán)境下編程,可能需要更改相應(yīng)的網(wǎng)絡(luò)編程API,修改后的功能讀者自行驗(yàn)證。


TCP客戶端/服務(wù)器代碼邏輯的剖析


? 在Linux環(huán)境下,要實(shí)現(xiàn)網(wǎng)絡(luò)通訊,我們一般采用的都是socket編程;但是,Linux環(huán)境下的socket編程是一個大類,并不僅僅只有網(wǎng)絡(luò)編程才是socket編程,有一種叫Unix Domain Socket編程,它也叫socket編程。只不過它一般不用于遠(yuǎn)程的網(wǎng)絡(luò)通訊,而是用于本地(當(dāng)前主機(jī)環(huán)境內(nèi))進(jìn)程之間的通訊。曾經(jīng)就因?yàn)檫@個問題,筆者在一次面試中,就被見多識廣的面試官DISS了一番,希望大家也補(bǔ)補(bǔ)這方面的知識。以下部分講述的主要是基于局域網(wǎng)或廣域網(wǎng)的網(wǎng)絡(luò)socket編程。

? 在網(wǎng)絡(luò)socket編程中,會有2種不同的【身份】:客戶端和服務(wù)器。【客戶端】指的是,網(wǎng)絡(luò)連接的發(fā)起方,作為網(wǎng)絡(luò)處理的請求方,向?qū)Χ苏埱竽撤N服務(wù)。【服務(wù)器】指的是,網(wǎng)絡(luò)連接的被動連接方,一般它不能主動連接別人,只能監(jiān)聽客戶端的連接,待它收到客戶端的服務(wù)請求后,會對客戶端的服務(wù)請求做出響應(yīng);通常服務(wù)器的運(yùn)行模式是一個服務(wù)器可對應(yīng)N個客戶端。

? 在TCP socket 網(wǎng)絡(luò)編程中,客戶端的代碼邏輯一般是:

【 socket -> bind -> connect -> send -> recv -> close 】
socket:創(chuàng)建一個socket套接字,用于執(zhí)行此次網(wǎng)絡(luò)連接
bind:將服務(wù)器的信息(主要是ip和端口)與創(chuàng)建的socket綁定
connect: 向服務(wù)器發(fā)起網(wǎng)絡(luò)連接請求
send: 將客戶端的數(shù)據(jù)發(fā)送到服務(wù)器端
recv: 接收服務(wù)器回應(yīng)的處理數(shù)據(jù)
close: 關(guān)閉socket套接字,釋放對應(yīng)的系統(tǒng)資源

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-6R5slz09-1661923478821)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

? 對應(yīng)的,TCP服務(wù)器的代碼邏輯一般是:

【 socket -> bind -> listen -> accept -> recv -> send -> close 】
socket:創(chuàng)建一個socket套接字,用于執(zhí)行此次服務(wù)器的網(wǎng)絡(luò)服務(wù)
bind:將當(dāng)前需要創(chuàng)建的服務(wù)器的信息(主要是ip和端口)與創(chuàng)建的socket綁定,該ip和端口就是客戶端bind操作時需要用到的ip和端口
listen: 設(shè)置socket套接字執(zhí)行監(jiān)聽,此處可以設(shè)置服務(wù)器最多能同時接收多少個客戶端的連接
accept: 接受客戶端的連接請求,此處對應(yīng)的就是客戶端的connect操作
recv: 接收客戶端發(fā)送的請求數(shù)據(jù)
send: 將處理完的請求數(shù)據(jù)發(fā)送到客戶端
close: 關(guān)閉socket套接字,釋放對應(yīng)的系統(tǒng)資源

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-erGqy5UU-1661923478827)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

? 了解了TCP客戶端和服務(wù)器的基本代碼邏輯后,我們直接附上tcp-echo-服務(wù)器的測試代碼:tcp_server_echo.c

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define MAX_CLINET_NUM 10 /** 最大客戶端連接數(shù),可根據(jù)實(shí)際情況增減 */

/** 使用hexdump格式打印數(shù)據(jù)的利器 */
static void hexdump(const char *title, const void *data, unsigned int len)
{
    char str[160], octet[10];
    int ofs, i, k, d;
    const unsigned char *buf = (const unsigned char *)data;
    const char dimm[] = "+------------------------------------------------------------------------------+";

    printf("%s (%d bytes)\n", title, len);
    printf("%s\r\n", dimm);
    printf("| Offset  : 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F   0123456789ABCDEF |\r\n");
    printf("%s\r\n", dimm);

    for (ofs = 0; ofs < (int)len; ofs += 16) {
        d = snprintf( str, sizeof(str), "| %08x: ", ofs );
        for (i = 0; i < 16; i++) {
            if ((i + ofs) < (int)len)
                snprintf( octet, sizeof(octet), "%02x ", buf[ofs + i] );
            else
                snprintf( octet, sizeof(octet), "   " );

            d += snprintf( &str[d], sizeof(str) - d, "%s", octet );
        }
        d += snprintf( &str[d], sizeof(str) - d, "  " );
        k = d;

        for (i = 0; i < 16; i++) {
            if ((i + ofs) < (int)len)
                str[k++] = (0x20 <= (buf[ofs + i]) &&  (buf[ofs + i]) <= 0x7E) ? buf[ofs + i] : '.';
            else
                str[k++] = ' ';
        }

        str[k] = '\0';
        printf("%s |\r\n", str);
    }

    printf("%s\r\n", dimm);
}

/** 獲取客戶端的ip和端口信息 */
static int get_clinet_ip_port(int sock, char *ip_port, int len, int *port)
{
    struct sockaddr_in sa;
    int sa_len;
	
    sa_len = sizeof(sa);
    if(!getpeername(sock, (struct sockaddr *)&sa, &sa_len)) {
        *port = ntohs(sa.sin_port);
        snprintf(ip_port, len, "%s", inet_ntoa(sa.sin_addr));
    }
    return 0;
}


/** 服務(wù)器端處理客戶端請求數(shù)據(jù)的線程入口函數(shù) */
static void *client_deal_func(void* arg)
{
    nt client_sock = *(int *)arg;
	
    while(1) {  
        char buf[4096];
        int ret;
		
        memset(buf,'\0',sizeof(buf));
        ret = read(client_sock,buf,sizeof(buf)); /* 讀取客戶端發(fā)送的請求數(shù)據(jù) */
        if (ret <= 0) {
            break; /* 接收出錯,跳出循環(huán) */
        }

        hexdump("server recv:", buf, ret);
        ret = write(client_sock, buf, ret); /* 將收到的客戶端請求數(shù)據(jù)發(fā)送回客戶端,實(shí)現(xiàn)echo的功能 */
        if( ret < 0) {
            break; /* 發(fā)送出錯,跳出循環(huán) */
        }
    }
	
    close(client_sock);
}

/** 服務(wù)器主函數(shù)入口,接受命令參數(shù)輸入,指定服務(wù)器監(jiān)聽的端口號 */
int main(int argc, char **argv)
{
    int ret;
    int ser_port = 0;
    int ser_sock = -1;
    int client_sock = -1;
    struct sockaddr_in server_socket;
    struct sockaddr_in socket_in;
    pthread_t thread_id;  
    int val = 1;
	
    /* 命令行參數(shù)的簡單判斷和help提示 */
    if(argc != 2) {
        printf("usage: ./client [port]\n");
        ret = -1;
        goto exit_entry;
    }
	
    /* 讀取命令行輸入的服務(wù)器監(jiān)聽的端口 */
    ser_port = atoi(argv[1]);
    if (ser_port <=0 || ser_port >= 65536) {
        printf("server port error: %d\n", ser_port);
        ret = -2;
        goto exit_entry;
    }
	
    /* 創(chuàng)建socket套接字 */
    ser_sock = socket(AF_INET, SOCK_STREAM, 0);
    if(ser_sock < 0) {
        perror("socket error");
        return -3;
    }
		
    /* 設(shè)置socket屬性,使得服務(wù)器使用的端口,釋放后,別的進(jìn)程立即可重復(fù)使用該端口 */
    ret = setsockopt(ser_sock, SOL_SOCKET,SO_REUSEADDR, (void *)&val, sizeof(val));
    if(ret == -1) {
        perror("setsockopt");
        return -4;
    }
	
    bzero(&server_socket, sizeof(server_socket));
    server_socket.sin_family = AF_INET;
    server_socket.sin_addr.s_addr = htonl(INADDR_ANY); //表示本機(jī)的任意ip地址都處于監(jiān)聽
    server_socket.sin_port = htons(ser_port);
	
    /* 綁定服務(wù)器信息 */
    if(bind(ser_sock, (struct sockaddr*)&server_socket, sizeof(struct sockaddr_in)) < 0) {
        perror("bind error");
        ret = -5;
        goto exit_entry;
    }
	
    /* 設(shè)置服務(wù)器監(jiān)聽客戶端的最大數(shù)目 */
    if(listen(ser_sock, MAX_CLINET_NUM) < 0) { 
        perror("listen error");
        ret = -6;
        goto exit_entry;
    }
	
    printf("TCP server create success, accepting clients ...\n");
    for(;;) { /* 循環(huán)等待客戶端的連接 */
        char buf_ip[INET_ADDRSTRLEN];		
        socklen_t len = 0;
        client_sock = accept(ser_sock, (struct sockaddr*)&socket_in, &len);
        if(client_sock < 0) {
            perror("accept error");
            ret = -7;
            continue;
        }		
        
        {
            char client_ip[128];
            int client_port;
            get_clinet_ip_port(client_sock, client_ip, sizeof(client_ip), &client_port);
            /* 打印客戶端的ip和端口信息 */
            printf("client connected [ip: %s, port :%d]\n", client_ip, client_port);
        }
		
        /* 使用多線程的方式處理客戶端的請求,每接收一個客戶端連接,啟動一個線程處理對應(yīng)的數(shù)據(jù) */
        pthread_create(&thread_id, NULL, (void *)client_deal_func, (void *)&client_sock);  
        pthread_detach(thread_id); 
    }
	
exit_entry:
    if (ser_sock >= 0) {
        close(ser_sock); /* 程序退出前,釋放socket資源 */
    }
    return 0;
}

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-PtxtqEBB-1661923478828)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]


TCP服務(wù)器端如何獲取客戶端的IP地址和端口信息


? 如上的測試代碼中,有這么一個函數(shù):

/** 獲取客戶端的ip和端口信息 */
static int get_clinet_ip_port(int sock, char *ip_port, int len, int *port)
{
    struct sockaddr_in sa;
    int sa_len;
	
    sa_len = sizeof(sa);
    if(!getpeername(sock, (struct sockaddr *)&sa, &sa_len)) {
        *port = ntohs(sa.sin_port);
        snprintf(ip_port, len, "%s", inet_ntoa(sa.sin_addr));
    }
    return 0;
}

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-s92JFClt-1661923478839)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

? get_clinet_ip_port函數(shù)是在服務(wù)器成功接受了客戶端的連接之后被調(diào)用,sock是該通訊鏈路對應(yīng)的socket通道,函數(shù)內(nèi)部通過getpeername接口,取得對方(客戶端)的地址信息,存放在結(jié)構(gòu)體sa中;接著使用ntohs將sa中的端口信息轉(zhuǎn)成int類型,通過函數(shù)的入?yún)ort傳遞出去;使用inet_ntoa將sa中的ip地址信息轉(zhuǎn)成字符串類型,通過函數(shù)的入?yún)p傳遞出去。這樣,函數(shù)的調(diào)用者,通過ip和port變量就取得了客戶端的ip和端口信息了。下面會給出,這個函數(shù)成功調(diào)用后,打印出的客戶端信息范例。


TCP回顯測試服務(wù)器的使用和驗(yàn)證


? 有了tcp-server-echo的代碼,我們就可以執(zhí)行編譯、測試了。編譯程序,在Linux控制臺如下輸入:

gcc tcp_server_echo.c -o tcp_server_echo -lpthread

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-RgCENij3-1661923478841)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

? 加上-lpthread表示鏈接多線程庫,因?yàn)槌绦蛑杏玫搅硕嗑€程操作。正常編譯成功后,就可以在當(dāng)前工程目錄看到tcp_server_echo文件的存在,這個就是我們編譯出來的可執(zhí)行文件。

? 編譯成功后,使用以下命令啟動服務(wù)器,其中6210表示啟動服務(wù)器需要監(jiān)聽的端口號;注意,啟動服務(wù)器時一定要輸入監(jiān)聽的端口號,否則啟動會報(bào)錯。

./tcp_server_echo 6210

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-RpaaPcOC-1661923478843)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

? 以下是筆者使用該測試服務(wù)器對客戶端的連接做echo測試,記錄如下:

? 服務(wù)器端的輸出:

img

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-3rgsFgSy-1661923478845)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]編輯

? 以下是客戶端對應(yīng)的接收的3組echo請求數(shù)據(jù):

img

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-JZv1RaVq-1661923478849)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]編輯

img

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-k63YVfFw-1661923478850)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]編輯

img

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-cVqFINIm-1661923478852)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]編輯

? 經(jīng)對比可以發(fā)現(xiàn),echo的數(shù)據(jù)與客戶端發(fā)送的原始請求數(shù)據(jù)是一致的,證明echo-server運(yùn)行是完全沒有問題的。


? 綜述,靈活使用好這個echo服務(wù)器可以高效地對客戶端的網(wǎng)絡(luò)做一些排查工作,比如通過客戶端去連接這個echo服務(wù)器,就可以很快知道客戶端當(dāng)前的網(wǎng)絡(luò)環(huán)境是不是暢通的?數(shù)據(jù)發(fā)送和數(shù)據(jù)接收功能是否是正常的?還可以大致分析出客戶端網(wǎng)絡(luò)通訊的瓶頸,究竟是連接耗時還是數(shù)據(jù)發(fā)送耗時,還是數(shù)據(jù)接收耗時,具體的耗時大致是什么級別,等等。

? 話又說回來,文中的echo服務(wù)器代碼畢竟僅僅是測試代碼,僅用于應(yīng)對一些網(wǎng)絡(luò)測試功能;如果真要應(yīng)用在正式的生產(chǎn)環(huán)境,那其中的個別代碼還需要進(jìn)一步斟酌、優(yōu)化,這部分的工作就交給有心的讀者吧。如果讀者在閱讀文本的過程中,發(fā)現(xiàn)有紕漏之處,可以隨時與筆者聯(lián)系,歡迎您的指正。謝謝。

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

    關(guān)注

    12

    文章

    9253

    瀏覽量

    85748
  • TCP
    TCP
    +關(guān)注

    關(guān)注

    8

    文章

    1374

    瀏覽量

    79159
  • ECHO
    +關(guān)注

    關(guān)注

    1

    文章

    73

    瀏覽量

    27187
  • 網(wǎng)絡(luò)編程
    +關(guān)注

    關(guān)注

    0

    文章

    72

    瀏覽量

    10088
收藏 人收藏

    評論

    相關(guān)推薦

    串口服務(wù)器——TCP Server

    。在實(shí)際應(yīng)用中,我們經(jīng)常會遇到需要將串口數(shù)據(jù)轉(zhuǎn)發(fā)到TCP服務(wù)器或?qū)?b class='flag-5'>TCP服務(wù)器數(shù)據(jù)轉(zhuǎn)發(fā)到串口的情況,所以本文將介紹如何實(shí)現(xiàn)串口接入TCP
    的頭像 發(fā)表于 07-31 17:58 ?1697次閱讀
    串口<b class='flag-5'>服務(wù)器</b>——<b class='flag-5'>TCP</b> Server

    三分鐘使用HMI Board完成TCP ECHO服務(wù)器的搭建

    本文將使用 HMI Board 完成 TCP ECHO 服務(wù)器的搭建。得益于 RT - Thread 完善的設(shè)備驅(qū)動與其強(qiáng)大的軟件包生態(tài),此次開發(fā)完全做到0代碼,并且可以在極短的時間內(nèi)完成。
    的頭像 發(fā)表于 11-13 17:18 ?1048次閱讀
    三分鐘使用HMI Board完成<b class='flag-5'>TCP</b> <b class='flag-5'>ECHO</b><b class='flag-5'>服務(wù)器</b>的搭建

    測試echo服務(wù)器lwip時出現(xiàn)問題的解決辦法?

    嗨,我想利用sdk測試echo服務(wù)器lwip,fpga程序并運(yùn)行configration。但是,在控制臺中,有一些行讓我感到困惑。----- lwIP TCP
    發(fā)表于 05-12 07:58

    如何使用Socket實(shí)現(xiàn)TCP服務(wù)器

    TCP 服務(wù)器。我們先將 socket 編程的流程列出來,然后給出具體的實(shí)例。  TCP 服務(wù)器的 socket
    發(fā)表于 03-30 06:07

    4412開發(fā)板Qt網(wǎng)絡(luò)編程-TCP實(shí)現(xiàn)服務(wù)器和客戶端

    網(wǎng)絡(luò)編程TCP 和 UDP,TCP 編程需要用到倆個類:QTcpServer 和 QTcpSocket。1
    發(fā)表于 04-28 15:33

    TCP服務(wù)器創(chuàng)建過程

    用過正點(diǎn)原子LWIP服務(wù)器例程開發(fā)的朋友可能知道,例程的設(shè)計(jì)是只支持一個客戶端連接的,但實(shí)際應(yīng)用中往往需要用到多客戶端連接。下面是在正點(diǎn)原子擴(kuò)展例程網(wǎng)絡(luò)實(shí)驗(yàn)14 NETCONN_TCP 服務(wù)器
    發(fā)表于 08-24 08:03

    使用網(wǎng)絡(luò)調(diào)試助手模擬TCP服務(wù)器

    上一篇分享的:AT指令測試WIFI通信模組并獲取天氣數(shù)據(jù),我們在測試AT+CIPSTART這條指令(連接服務(wù)端)時給出了三種方法,其中第三種方法是使用一些網(wǎng)絡(luò)調(diào)試助手模擬
    發(fā)表于 01-13 06:50

    echo什么意思_@echo off的作用

    本文介紹了echo在Linux和dos中的含義及應(yīng)用,以及@echo的作用。英文原義:EchoProtocol中文釋義:應(yīng)答協(xié)議注解,主要用于調(diào)試和檢測中。它可以基于TCP協(xié)議,
    發(fā)表于 11-21 23:36 ?3.7w次閱讀
    <b class='flag-5'>echo</b>什么意思_@<b class='flag-5'>echo</b> off的作用

    RAW API 接口的TCP服務(wù)器

    RAW Tcp回響服務(wù)器
    的頭像 發(fā)表于 07-05 00:10 ?3856次閱讀
    RAW API 接口的<b class='flag-5'>TCP</b><b class='flag-5'>服務(wù)器</b>

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

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

    ESP8266作為TCP客戶端連接TCP服務(wù)器測試的實(shí)例資料說明

    本文檔的主要內(nèi)容詳細(xì)介紹的是ESP8266作為TCP客戶端連接TCP服務(wù)器測試的實(shí)例資料說明。
    發(fā)表于 06-06 17:51 ?8次下載
    ESP8266作為<b class='flag-5'>TCP</b>客戶端連接<b class='flag-5'>TCP</b><b class='flag-5'>服務(wù)器</b>和<b class='flag-5'>測試</b>的實(shí)例資料說明

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

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

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

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

    基于LwIP的TCP服務(wù)器設(shè)計(jì)

    前面我們實(shí)現(xiàn)了UDP服務(wù)器及客戶端以及基于其上的TFTP應(yīng)用服務(wù)器。接下來我們將實(shí)現(xiàn)同樣廣泛應(yīng)用的TCP協(xié)議各類應(yīng)用。
    的頭像 發(fā)表于 12-14 15:09 ?1721次閱讀
    基于LwIP的<b class='flag-5'>TCP</b><b class='flag-5'>服務(wù)器</b>設(shè)計(jì)

    基于TCP的Telnet服務(wù)器設(shè)計(jì)

    前面我們已經(jīng)實(shí)現(xiàn)了基于RAW API的TCP服務(wù)器和客戶端,也在此基礎(chǔ)上實(shí)現(xiàn)了HTTP應(yīng)用。接下來我們實(shí)現(xiàn)一個基于TCP的Telnet服務(wù)器應(yīng)用。
    的頭像 發(fā)表于 12-14 15:30 ?1375次閱讀
    基于<b class='flag-5'>TCP</b>的Telnet<b class='flag-5'>服務(wù)器</b>設(shè)計(jì)
    主站蜘蛛池模板: 黄色一级片视频| 18女毛片| 欧美色图综合网| 欧美综合国产精品日韩一| 男人的天堂97| 久久www免费人成高清| 国产农村一级特黄α真人毛片| 丁香5月婷婷| 天天做.天天爱.天天综合网| 欧美tube44videos| 147西西人体大胆免费网| 黄床大片| 69精品在线观看| 四虎在线免费视频| 欧美一级日韩在线观看| 久操福利视频| 亚洲深夜在线| 国产色片| 亚洲二区在线观看| 亚洲国产人成在线观看| 日本最新免费网站| 国产一区美女| 天天草综合| 亚洲啪啪免费视频| 九九re6精品视频在线观看| 性欧美精品久久久久久久| 欧洲人体超大胆露私视频| 国产69精品久久久久9999| 天天干小说| tube日本videos69| 亚1州区2区三区4区产品| 男女爱爱福利| 亚洲精品理论| 在线观看黄色x视频| 加勒比一区二区| 三级黄色a| 99免费视频观看| 99久久伊人一区二区yy5099| 国内精品99| 欧美视频综合| 午夜剧院免费|