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发送一个数据,可以看到,接收成功