esp32 tcp client的使用

一、esp32 tcp 客户端使用步骤

1、创建一个套接字描述符 使用socket(AF_INET, SOCK_STREAM ,0)函数

2、设置本地端口等   使用bind(tcpsock,(struct sockaddr *)&Loacl_addr,sizeof(Loacl_addr));

3、连接server    使用connect(tcpsock, (struct sockaddr *)&dest_addr, sizeof(dest_addr));

4、发送数据    使用send(tcpsock, "tcp test", strlen("tcp test"), 0);

5、接收服务器的数据  使用recv(tcpsock, rx_buffer, sizeof(rx_buffer) - 1, 0);

 

二、详细代码


#include <string.h>
#include <sys/param.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
#include "esp_system.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include "tcpip_adapter.h"

#include "lwip/err.h"
#include "lwip/sockets.h"
#include "lwip/sys.h"
#include <lwip/netdb.h>


#define HOST_IP_ADDR "192.168.43.95"
#define PORT         12345
int tcpsock = 0;
struct sockaddr_in dest_addr;
 TaskHandle_t xtcpRecvTask = NULL;

void tcp_recv_data(void *pvParameters){

    uint8_t rx_buffer[1024] = {0};
    printf("create tcp recv\n");
        int err = send(tcpsock, "tcp test", strlen("tcp test"), 0);
    if (err < 0) {
        printf( "Error occurred during sending: errno %d", errno);
        return;
        }
        printf("Message sent");

   
    while (1)
    {
        int len = recv(tcpsock, rx_buffer, sizeof(rx_buffer) - 1, 0);
        if(len > 0){
                rx_buffer[len] = 0; // Null-terminate whatever we received and treat like a string
                printf("Received %d bytes from %s:\n", len, rx_buffer);
          
                int err = send(tcpsock, rx_buffer, len, 0);
                if (err < 0) {
                    printf( "Error occurred during sending: errno %d", errno);
                    return;
                 }
                 printf("Message sent");
        }
    }

}

void tcp_ini_client(void){

    tcpsock = socket(AF_INET, SOCK_STREAM ,0);
     printf("sock:%d\n",tcpsock);
    if(tcpsock < 0){
        
       printf( "Unable to create socket: errno %d", errno);
       return;
    }
    printf("Socket created, sending to %s:%d", HOST_IP_ADDR, PORT);
   
    dest_addr.sin_addr.s_addr = inet_addr(HOST_IP_ADDR);
    dest_addr.sin_family = AF_INET;
    dest_addr.sin_port = htons(PORT);
    struct sockaddr_in Loacl_addr;  //设置本地端口
    Loacl_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    Loacl_addr.sin_family = AF_INET;
    Loacl_addr.sin_port = htons(54321);
    uint8_t res = 0;
    res = bind(tcpsock,(struct sockaddr *)&Loacl_addr,sizeof(Loacl_addr));
    if(res != 0){
        printf("bind error\n");

    }
    int err = connect(tcpsock, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
    if (err != 0) {
            printf( "Socket unable to connect: errno %d", errno);
            return;
        }
    printf( "Successfully connected\n");
    xTaskCreate(&tcp_recv_data,"tcp_recv_data",2048*2,NULL,10,&xtcpRecvTask);
    }

  

三、测试结果

流程和UDP 的是一样的 开始client发送一个字符串 然后等待接收服务器的数据并且把接收到的数据原路返回

 

 

 

 

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

做了不一定能实现但不做一定不会实现

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值