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發送一個數據,可以看到,接收成功