ESP8266 RTOS學習之旅(4)— UDP通信和TCP客戶端通信

UDP通信和TCP客戶端通信

一、前言

在之前的基礎上開始:ESP8266 RTOS學習之旅(3)— 連接到WiFi
user文件夾下新建一個文件app_main.c,然後再wifi連接成功後創建一個任務,任務函數爲app_main(),這樣我們就可以在app_main.c中的app_main()函數實現UDP和TCP通信。

xTaskCreate(app_main, "app main", 256, NULL, 8, NULL);

二、UDP通信

app_main.c如下所示:

#include "esp_common.h"
#include "lwip/sockets.h"

int app_main(void )
{
	/* 1. 創建一個socket,協議簇爲AF_INET 協議棧,類型是SOCK_DGRAM,UDP類型 */
    int sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sock_fd  == -1)
    {
        printf("Socket error\n");
        return 0;
    }
    
	/* 2. 準備接收方的地址和端口,'192.168.0.107'表示目的ip地址,8080表示目的端口號  */
    struct sockaddr_in server_addr = {0};	
    server_addr.sin_family = AF_INET;                         // 設置地址族爲IPv4
    server_addr.sin_port = htons(8266);						// 設置地址的端口號信息
    server_addr.sin_addr.s_addr = inet_addr("192.168.0.107");	// 設置IP地址

    /* 3. 發送數據到指定的ip和端口 */
	char sendbuf[]={"hello world."};
	sendto(sock_fd, sendbuf, sizeof(sendbuf), 0, (struct sockaddr*)&server_addr, sizeof(server_addr));
	
    // 4. 關閉套接字
    close(sock_fd);

    return 0;
}

在電腦上打開網絡調試助手,可以看到已經接收到數據了。
注意:要將電腦的防火牆關閉
在這裏插入圖片描述

三、TCP通信

app_main.c如下所示:

#include "esp_common.h"
#include "lwip/sockets.h"

int app_main(void)
{
    int ret;
    // 1、使用socket()函數獲取一個TCP客戶端socket文件描述符
	int tcp_client = socket(AF_INET, SOCK_STREAM, 0);
    if (-1 == tcp_client)
	{
		perror("socket");
		return -1;
	}

    // 2、準備服務端的地址和端口,'192.168.0.107'表示目的ip地址,12341表示目的端口號
    struct sockaddr_in server_addr = {0};
	server_addr.sin_family = AF_INET;                           // 設置地址族爲IPv4
	server_addr.sin_port = htons(8266);						// 設置地址的端口號信息
	server_addr.sin_addr.s_addr = inet_addr("192.168.0.103");	// 設置IP地址

    // 3、鏈接到服務器
    ret = connect(tcp_client, (const struct sockaddr *)&server_addr, sizeof(server_addr));
    if (ret < 0)
		perror("connect");
    else
	    printf("connect result, ret = %d.\n", ret);

    // 4. 發送數據到服務端
	char sendbuf[]={"hello world."};
	ret = send(tcp_client, sendbuf, strlen(sendbuf),0);

    // 5、等待接收服務端發送過來的數據,最大接收1024個字節
    char *recvbuf = os_malloc(1024);
    while(1)
    {
		ret = recv(tcp_client, recvbuf, 1024, 0);
		recvbuf[ret] = '\0';

		// 6、將接收到的數據打印出來
		printf("Recvdate:%s \n",recvbuf);
    }

    // 7、關閉套接字
    close(tcp_client);

    return 0;
}

在電腦上打開網絡調試助手,可以看到已經接收到數據了。
注意:要將電腦的防火牆關閉
在這裏插入圖片描述
使用網絡調試助手向ESP8266發送一個數據,可以看到,接收成功
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章