esp8266RTOS3.1之TCP Client实验

esp8266 RTOS3.1的SDK移植了socket,相对于RTOS2.0的sdk,可谓是完全变了模样,在看这个例程实验时,大家最好先看一下socket相关的api,下面开始了
以下是本程序中使用的宏定义

#define HOST_IP_ADDR "xxx.xxx.xxx.xxx" //TCP服务端的IP地址,如果你用的tcp调试助手,就是你的电脑IP
#define PORT xxxx  //TCP服务端的端口号

首先是连接wifi,这里就不介绍了,有什么不懂的直接传送这里wifi配置
然后再主函数中创建任务

xTaskCreate(tcp_client_task, "tcp_client", 4096, NULL, 5, NULL);

接下来直接进入TCP_client任务吧

static void tcp_client_task(void *pvParameters)
{
    char rx_buffer[128];
    char addr_str[128];
    int addr_family;
    int ip_protocol;

    while (1) {

        struct sockaddr_in destAddr;                     //目标地址结构体,即服务端
        destAddr.sin_addr.s_addr = inet_addr(HOST_IP_ADDR);             //将点分十进制的IP转成长整型
        destAddr.sin_family = AF_INET;                        //IPV4 TCP/IP协议族
        destAddr.sin_port = htons(PORT);               //将主机字节顺序转换为网络字节顺序
        addr_family = AF_INET;							//IPV4 TCP/IP协议族
        ip_protocol = IPPROTO_IP;                  //IP协议字段,IPV4一般为保留
        inet_ntoa_r(destAddr.sin_addr, addr_str, sizeof(addr_str) - 1); //将IP转成长整型转换成点分十进制字符串
        int sock =  socket(addr_family, SOCK_STREAM, ip_protocol);  //根据参数建立socket的文件描述符,这里是IPV4,TCP协议
        if (sock < 0) {
            break;
        }
        int err = connect(sock, (struct sockaddr *)&destAddr, sizeof(destAddr));//连接至服务端
        printf("\n\rconnect\n\r");
        if (err != 0)
        {
            break;
        }

        while (1) {
            int err = send(sock, payload, strlen(payload), 0);//发送消息至服务端
            if (err < 0) {
                break;
            }

            int len = recv(sock, rx_buffer, sizeof(rx_buffer) - 1, 0);//接受消息,当未接受到消息时,程序停留在这里,接受后,程序继续执行
            if (len < 0) {
                break;
            }

            else {
                rx_buffer[len] ='\0';//在字符串末尾加上'\0',防止字符串数组空参数,乱码
                ESP_LOGI(TAG, "Received %d bytes from %s:", len, addr_str);
                printf("\n\r%s\n\r",rx_buffer); 
            }

            vTaskDelay(2000 / portTICK_PERIOD_MS);

        }

        if (sock != -1) {
            shutdown(sock, 0);//程序如果运行到这,说明异常,则禁止在一个套接口上进行数据的接收与发送。
            close(sock);关闭socket
        }
    }
    vTaskDelete(NULL);
}

好了,完成了,源代码我就放这了我的github

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值