一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

基于MM32F3270以太網(wǎng)Server_Socket使用

jf_pJlTbmA9 ? 來源:靈動MM32MCU ? 作者:靈動MM32MCU ? 2023-09-27 15:41 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

上一節(jié)我們對TCP的報文和連接過程做了介紹,本節(jié)通過Socket的方式對整個通信過程再次進行一次整理(使用Socket方式易于加深對以太網(wǎng)通信過程的理解,在此講解使用的是完整版Socket)。

pYYBAGIB2LGAeMs-AADMqC3vnlU002.png

服務器端初始化

1)調(diào)用socket,向內(nèi)核申請一個套接字sock

2)調(diào)用bind將sock與服務器端的IP與PORT綁定

3)調(diào)用listen將套接字設(shè)為監(jiān)聽模式,準備接收客戶端連接請求

4)調(diào)用accept等待并接收客戶端的連接請求,建立好TCP連接后,該函數(shù)會返回一個新的已連接套接字connected

創(chuàng)建連接

1)客戶端調(diào)用socket創(chuàng)建套接字

2)調(diào)用connect,向服務器發(fā)送連接請求

3)connect會發(fā)送一個請求SYN段并阻塞等待服務器應答(第一次握手)

4)服務器收到SYN,會給客戶端發(fā)送一個確認應答ACK,同時發(fā)送一個請求(SYN)建立連接(第二次握手)

5)客戶端收到服務器發(fā)的SYN+ACK段,表明客戶端連接已建立成功,進入已連接狀態(tài)。客戶端再向服務器發(fā)送一個ACK段,服務器收到后則服務器連接成功

數(shù)據(jù)傳輸

1)服務器端使用accept連接建立成功后(通信雙方可同時寫數(shù)據(jù),支持全雙工),調(diào)用read開始讀數(shù)據(jù),若沒有數(shù)據(jù)則阻塞等待

2)客戶端調(diào)用write向服務器發(fā)送數(shù)據(jù)請求,客戶端收到之后調(diào)用read處理請求,此過程服務器調(diào)用read阻塞等待

3)服務器調(diào)用write將處理好的請求發(fā)送給客戶端,再次調(diào)用read等待下一個請求

4)服務器收到SYN,會給客戶端發(fā)送一個確認應答ACK,同時發(fā)送一個請求(SYN)建立連接(第二次握手)

4)客戶端收到后從read返回,發(fā)送下一條請求,如此循環(huán)下去

斷開連接

1)沒有數(shù)據(jù),則客戶端調(diào)用close關(guān)閉連接,給服務器發(fā)送一個斷開連接請求FIN段(第一次握手)

2)服務器收到客戶端的FIN段,給客戶端發(fā)送一個確認應答ACK段,表明同意斷開連接??蛻舳耸盏紸CK段并調(diào)用read返回0,表明客戶端連接已經(jīng)斷開(第二次握手)

3)read返回0后,服務器知道客戶端已經(jīng)斷開連接,它也調(diào)用close關(guān)閉連接,給客戶端發(fā)送一個斷開連接請求FIN段(第三次握手)

4)客戶端收到服務器發(fā)送的FIN段,就給服務器一個確認應答ACK段,表明同意斷開連接??蛻舳诉M入TIME_WAIT狀態(tài),服務器收到客戶端的ACK段后也斷開連接

poYBAGIB2LOAM497AAPsrNcBvq0265.png

實驗使用MB-039開發(fā)板,在應用工程中使用LwIP+FreeRTOS,實驗展示如何制作一個TCP Server_socket,并收發(fā)數(shù)據(jù),實驗使用到的硬件如下:

poYBAGIB1SyAHYynAAG39uXw7q0489.png

如圖是MB-039(完整原理圖可以通過MM32官網(wǎng)下載)的Ethermac部分。

各個信號引腳對應如下:

pYYBAGIB2LaAK68tAAAOS9P2fmc664.png
poYBAGIB1TGAFwREAAi12qR49zc411.png

Server_socket實驗用到的API大部分在前面已經(jīng)進行講解(只是對NETCONN接口編輯方式進行二次封裝),本節(jié)只介紹一個比較關(guān)鍵的API:setsockopt(s,level,optname,opval,optlen)。

從名稱中就可以看出函數(shù)功能用于設(shè)置套接字的一些選項,我們關(guān)注一下參數(shù):

(1)level有多個常用的選項

SOL_SOCKET:表示在Socket層
IPPROTO_TCP:表示在TCP層
IPPROTO_IP:表示在IP層

(2)optname 表示該層的具體選項名稱

level為SOL_SOCKET時,有以下選項:SO_REUSEADDR(允許重用本地地址和端口)、

SO_SNDTIMEO(設(shè)置發(fā)送數(shù)據(jù)超時時間)、SO_SNDTIMEO(設(shè)置接收數(shù)據(jù)超時時間)、SO_RCVBUF(設(shè)置發(fā)送數(shù)據(jù)緩沖區(qū)大小)等。

level為IPPROTO_TCP時,有以下選項:TCP_NODELAY(不使用Nagle算法)、TCP_KEEPALIVE(設(shè)置TCP?;顣r間)等。

level為IPPROTO_IP選項,有以下選項:IP_TTL(設(shè)置生存時間)、IP_TOS(設(shè)置服務類型)等。

實現(xiàn)Server_socket函數(shù):

static void server_socket(void* thread_param)
{ 
    int sock = -1, connected;
    char* recv_data;
    struct sockaddr_in server_addr, client_addr;
    socklen_t sin_size;
    int recv_data_len;

    printf("The local port number is%dnn", LOCAL_PORT);
    recv_data = (char*)pvPortMalloc(RECV_DATA);
    if (recv_data == NULL) {
        printf("No memoryn");
        goto __exit;
    }
    sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock < 0) {
        printf("Socket errorn");
        goto __exit;
    }
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = INADDR_ANY;
    server_addr.sin_port = htons(LOCAL_PORT);
    memset( (server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));
    if (bind(sock, (struct sockaddr*) server_addr, sizeof(struct sockaddr)) == -1) {
        printf("Unable to bindn");
        goto __exit;
    }
    if (listen(sock, 5) == -1) {                         // (1)
        printf("Listen errorn");
        goto __exit;
    }
    while(1) {
        sin_size = sizeof(struct sockaddr_in);
        connected = accept(sock, (struct sockaddr*) client_addr,  sin_size);  // (2)
        printf("new client connected from (%s, %d)n",
               inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
        {
            int flag = 1;
            setsockopt(connected,
                       IPPROTO_TCP,     /* set option at TCP level */
                       TCP_NODELAY,     /* name of option */
                       (void*)  flag,   /* the cast is historical cruft */
                       sizeof(int));    /* length of option value */      // (3)
        }
        while(1) {
            recv_data_len = recv(connected, recv_data, RECV_DATA, 0);    // (4)
            if (recv_data_len <= 0)
                break;
            printf("recv %d len datan", recv_data_len);
            write(connected, recv_data, recv_data_len);   // (5)
        }
        if (connected >= 0)
            closesocket(connected);                  //  (6)
        connected = -1;
    }
__exit:
    if (sock >= 0) closesocket(sock);
    if (recv_data) free(recv_data);
}

1)進入監(jiān)聽狀態(tài)

2)阻塞應用線程直至與遠端主機建立TCP連接,建立成功后遠程主機的信息將保持在連接句柄中(connected)

3)對套接字connected進行設(shè)置:在TCP層,不使用Nagle算法

4)處理客戶端的連接請求,接收遠程主機信息

5)將接收的數(shù)據(jù)進行轉(zhuǎn)發(fā)

6)主動關(guān)閉客戶端的連接

到這里已經(jīng)完成了Server_socket函數(shù)的創(chuàng)建,看一下PC的IP地址,設(shè)備需要處于同一網(wǎng)段方便測試。打開命令行窗口輸入:ipconfig

pYYBAGIB1TOARaWcAAEnlBhO5H8936.png

PC的地址為:192.168.105.34,在sys_arch.h文件中對DEST_IP_ADDR0 、DEST_IP_ADDR1、DEST_IP_ADDR2、DEST_IP_ADDR3進行修改,DEST_PORT 隨意修改。

#define LOCAL_PORT                 2021

#define IP_ADDR0                    192
#define IP_ADDR1                    168
#define IP_ADDR2                    105
#define IP_ADDR3                    26

將程序下載入開發(fā)板中,使用NetAssist進行如下設(shè)置:

1)協(xié)議設(shè)置,此時設(shè)備為Server,則PC為Client

2)設(shè)置遠程主機地址(即設(shè)備地址)

3)端口號

poYBAGIB2LqAdSiQAAFh-INvmSs790.png

點擊連接,若提示連接失敗,則Ping一下開發(fā)板地址,可以正常Ping通則檢查端口號;如果無法Ping通則需要對工程進行檢查。

pYYBAGIB2L2ABDnEAAFu311zkS8170.png

任意輸入字符進行發(fā)送。

pYYBAGIB2L-ABHo3AAItUIKKqj8606.png

通過上圖可以觀察到發(fā)送成功,并且設(shè)備返回數(shù)據(jù)與發(fā)送數(shù)據(jù)一致,表明實驗成功。

實驗程序請登錄我們的官網(wǎng)下載MM32F3270 SDK,工程路徑如下:

~MM32F3270_Lib_Samples_V0.90Demo_appEthernet_DemoETH_RTOSFreertos_Server_socket

來源:靈動MM32MCU

審核編輯:湯梓紅

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

    關(guān)注

    41

    文章

    5631

    瀏覽量

    175881
  • 通信
    +關(guān)注

    關(guān)注

    18

    文章

    6206

    瀏覽量

    137795
  • Server
    +關(guān)注

    關(guān)注

    0

    文章

    94

    瀏覽量

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

    關(guān)注

    8

    文章

    1402

    瀏覽量

    81017
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    靈動微課堂 (第182講) | 基于MM32F3270 以太網(wǎng) Client_Socket使用

    :~\MM32F3270_Lib_Samples_V0.90\Demo_app\Ethernet_Demo\ETH_RTOS\Freertos_Client_socket下章的題目為《基于MM32F3270
    發(fā)表于 10-18 11:02

    靈動微課堂 (第183講) | 基于MM32F3270 以太網(wǎng) Server_Socket使用

    :~\MM32F3270_Lib_Samples_V0.90\Demo_app\Ethernet_Demo\ETH_RTOS\Freertos_Server_socket我們下節(jié)的題目為《基于MM32F3270
    發(fā)表于 10-18 11:08

    MM32F3270系列32位MCU的特點有哪些

    上海靈動微電子推出全新主流型MM32F3270系列32位MCU,此款MM32F3270系列是基于M3內(nèi)核的32位微控制器,MM32F3270適用于要求高集成度的高性能控制領(lǐng)域,如:工業(yè)控制、消防監(jiān)控
    發(fā)表于 11-03 07:20

    靈動微電子MM32F3270系列MCU的特點介紹

    上海靈動微電子推出全新主流型MM32F3270系列32位MCU,此款MM32F3270系列是基于M3內(nèi)核的32位微控制器,MM32F3270適用于要求高集成度的高性能控制領(lǐng)域,如:工業(yè)控制、消防監(jiān)控
    發(fā)表于 03-22 16:57 ?2329次閱讀

    【國產(chǎn)MCU移植】MM32F3270 EVBoard

    【國產(chǎn)MCU移植】MM32F3270 EVBoard
    發(fā)表于 12-03 17:21 ?5次下載
    【國產(chǎn)MCU移植】<b class='flag-5'>MM32F3270</b> EVBoard

    基于MM32F3270 以太網(wǎng) Client使用

    接下來給大家介紹基于TCP包的通訊。內(nèi)容分為基于MM32F3270以太網(wǎng)Client的使用與基于MM32F3270以太網(wǎng)Server的使用。
    發(fā)表于 02-08 15:10 ?0次下載
    基于<b class='flag-5'>MM32F3270</b> <b class='flag-5'>以太網(wǎng)</b> Client使用

    基于MM32F3270 以太網(wǎng) Server_Socket使用

    本節(jié)通過Socket的方式對整個通信過程再次進行一次整理(使用Socket方式易于加深對以太網(wǎng)通信過程的理解,在此講解使用的是完整版Socket)。
    發(fā)表于 02-08 15:17 ?0次下載
    基于<b class='flag-5'>MM32F3270</b> <b class='flag-5'>以太網(wǎng)</b> <b class='flag-5'>Server_Socket</b>使用

    MM32F3270 ADC注入通道

    MM32F3270 ADC注入通道
    的頭像 發(fā)表于 09-27 15:59 ?1360次閱讀
    <b class='flag-5'>MM32F3270</b> ADC注入通道

    使用MM32F3270 FSMC驅(qū)動OLED

    使用MM32F3270 FSMC驅(qū)動OLED
    的頭像 發(fā)表于 09-27 15:30 ?1478次閱讀
    使用<b class='flag-5'>MM32F3270</b> FSMC驅(qū)動OLED

    使用MM32F3270 FSMC驅(qū)動TFT-LCD

    使用MM32F3270 FSMC驅(qū)動TFT-LCD
    的頭像 發(fā)表于 09-27 15:34 ?1754次閱讀
    使用<b class='flag-5'>MM32F3270</b> FSMC驅(qū)動TFT-LCD

    基于MM32F3270以太網(wǎng)HTTP使用

    基于MM32F3270以太網(wǎng)HTTP使用
    的頭像 發(fā)表于 09-27 15:48 ?843次閱讀
    基于<b class='flag-5'>MM32F3270</b><b class='flag-5'>以太網(wǎng)</b>HTTP使用

    基于MM32F3270以太網(wǎng)Server使用

    基于MM32F3270以太網(wǎng)Server使用
    的頭像 發(fā)表于 09-27 15:46 ?742次閱讀
    基于<b class='flag-5'>MM32F3270</b><b class='flag-5'>以太網(wǎng)</b><b class='flag-5'>Server</b>使用

    基于MM32F3270以太網(wǎng)Client使用

    基于MM32F3270以太網(wǎng)Client使用
    的頭像 發(fā)表于 09-27 15:44 ?992次閱讀
    基于<b class='flag-5'>MM32F3270</b><b class='flag-5'>以太網(wǎng)</b>Client使用

    基于MM32F3270以太網(wǎng)UDP使用

    基于MM32F3270以太網(wǎng) UDP使用
    的頭像 發(fā)表于 09-27 15:42 ?794次閱讀
    基于<b class='flag-5'>MM32F3270</b><b class='flag-5'>以太網(wǎng)</b>UDP使用

    基于MM32F3270以太網(wǎng)Client_Socket使用

    基于MM32F3270以太網(wǎng)Client_Socket使用
    的頭像 發(fā)表于 09-27 15:37 ?811次閱讀
    基于<b class='flag-5'>MM32F3270</b><b class='flag-5'>以太網(wǎng)</b>Client_<b class='flag-5'>Socket</b>使用