8.26网络编程——Modbus TCP

文章目录

  • 一、思维导图
  • [二、在虚拟机写程序实现 poll 端功能,编写客户端实现和 Slave 通信](#二、在虚拟机写程序实现 poll 端功能,编写客户端实现和 Slave 通信)
    • [1> 单线圈数据的设置](#1> 单线圈数据的设置)
    • [2> 单线圈数据的读取](#2> 单线圈数据的读取)
    • [3> 多线圈数据的设置](#3> 多线圈数据的设置)
    • [4> 多寄存器数据的读取](#4> 多寄存器数据的读取)
    • [5> 多寄存器数据的设置](#5> 多寄存器数据的设置)
    • [6> 单寄存器数据的读取](#6> 单寄存器数据的读取)
  • 三、牛客网刷题

一、思维导图

二、在虚拟机写程序实现 poll 端功能,编写客户端实现和 Slave 通信

1> 单线圈数据的设置

c 复制代码
#include <myhead.h>
int main(int argc, const char *argv[])
{
    unsigned char buf[128] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x05, 0x00, 0x09, 0xFF, 0x00};
    // 设置套接字
    int sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock == -1)
    {
        printf("%d ", __LINE__);
        perror("socket error");
        return -1;
    }
    // 封装服务器的地址信息结构体
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(502);
    sin.sin_addr.s_addr = inet_addr("192.168.108.128"); // 服务器IP地址
    /*//连接服务器
    if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1)
    {
        perror("connect error");
        return -1;
    }
    printf("连接服务器成功\n");*/
    // 数据收发
    unsigned char replyBuf[128] = "";
    while (1)
    {
        // 连接服务器
        if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1)
        {
            perror("connect error");
            return -1;
        }
        printf("连接服务器成功\n");
        // 将请求包发送给服务器
        if (send(sock, buf, sizeof(buf), 0) == -1)
        {
            perror("send error");
            return -1;
        }

        // 读取服务器发来的消息
        bzero(replyBuf, sizeof(replyBuf));

        int res = recv(sock, replyBuf, sizeof(replyBuf), 0);

        for (int i = 0; i < res; i++)
        {
            printf("%#02x ", replyBuf[i]);
        }

        // printf("res = %d\n",res);
        printf("\n");
        printf("res = %d\n", res);
        sleep(1);
    }
    close(sock);
    return 0;
}

2> 单线圈数据的读取

c 复制代码
#include <myhead.h>
int main(int argc, const char *argv[])
{
    unsigned char buf[128] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x01, 0x00, 0x08, 0x00, 0x01};
    // 设置套接字
    int sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock == -1)
    {
        printf("%d ", __LINE__);
        perror("socket error");
        return -1;
    }
    // 封装服务器的地址信息结构体
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(502);
    sin.sin_addr.s_addr = inet_addr("192.168.108.128"); // 服务器IP地址
    /*//连接服务器
    if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1)
    {
        perror("connect error");
        return -1;
    }
    printf("连接服务器成功\n");*/
    // 数据收发
    unsigned char replyBuf[128] = "";
    while (1)
    {
        // 连接服务器
        if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1)
        {
            perror("connect error");
            return -1;
        }
        printf("连接服务器成功\n");
        // 将请求包发送给服务器
        if (send(sock, buf, sizeof(buf), 0) == -1)
        {
            perror("send error");
            return -1;
        }

        // 读取服务器发来的消息
        bzero(replyBuf, sizeof(replyBuf));

        int res = recv(sock, replyBuf, sizeof(replyBuf), 0);

        for (int i = 0; i < res; i++)
        {
            printf("%#02x ", replyBuf[i]);
        }

        // printf("res = %d\n",res);
        printf("\n");
        printf("res = %d\n", res);
        sleep(1);
    }
    close(sock);
    return 0;
}

3> 多线圈数据的设置

c 复制代码
#include <myhead.h>
int main(int argc, const char *argv[])
{
    unsigned char buf[128] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x0F, 0x00, 0x01, 0x00, 0x02,0x01,0x0F};
    // 设置套接字
    int sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock == -1)
    {
        printf("%d ", __LINE__);
        perror("socket error");
        return -1;
    }
    // 封装服务器的地址信息结构体
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(502);
    sin.sin_addr.s_addr = inet_addr("192.168.108.128"); // 服务器IP地址
    /*//连接服务器
    if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1)
    {
        perror("connect error");
        return -1;
    }
    printf("连接服务器成功\n");*/
    // 数据收发
    unsigned char replyBuf[128] = "";
    while (1)
    {
        // 连接服务器
        if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1)
        {
            perror("connect error");
            return -1;
        }
        printf("连接服务器成功\n");
        // 将请求包发送给服务器
        if (send(sock, buf, sizeof(buf), 0) == -1)
        {
            perror("send error");
            return -1;
        }

        // 读取服务器发来的消息
        bzero(replyBuf, sizeof(replyBuf));

        int res = recv(sock, replyBuf, sizeof(replyBuf), 0);

        for (int i = 0; i < res; i++)
        {
            printf("%#02x ", replyBuf[i]);
        }

        // printf("res = %d\n",res);
        printf("\n");
        printf("res = %d\n", res);
        sleep(1);
    }
    close(sock);
    return 0;
}

4> 多寄存器数据的读取

c 复制代码
#include <myhead.h>
int main(int argc, const char *argv[])
{
    unsigned char buf[128] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x03, 0x00, 0x01, 0x00, 0x02};
    // 设置套接字
    int sock = socket(AF_INET, SOCK_STREAM, 0); 
    if (sock == -1)
    {
        printf("%d ", __LINE__);
        perror("socket error");
        return -1;
    }
    // 封装服务器的地址信息结构体
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(502);
    sin.sin_addr.s_addr = inet_addr("192.168.108.128"); // 服务器IP地址
    /*//连接服务器
    if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1)
    {
        perror("connect error");
        return -1;
    }
    printf("连接服务器成功\n");*/
    // 数据收发
    unsigned char replyBuf[128] = "";
    while (1)
    {
        // 连接服务器
        if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1)
        {
            perror("connect error");
            return -1;
        }
        printf("连接服务器成功\n");
        // 将请求包发送给服务器
        if (send(sock, buf, sizeof(buf), 0) == -1)
        {
            perror("send error");
            return -1;
        }

        // 读取服务器发来的消息
        bzero(replyBuf, sizeof(replyBuf));

        int res = recv(sock, replyBuf, sizeof(replyBuf), 0);

        for (int i = 0; i < res; i++)
        {
            printf("%#02x ", replyBuf[i]);
        }

        // printf("res = %d\n",res);
        printf("\n");
        printf("res = %d\n", res);
        sleep(1);
    }
    close(sock);
    return 0;
}

5> 多寄存器数据的设置

c 复制代码
#include <myhead.h>
int main(int argc, const char *argv[])
{
    unsigned char buf[128] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x01, 0x10, 0x00, 0x01, 0x00, 0x01,0x02,0x00,0x0F};
    // 设置套接字
    int sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock == -1)
    {
        printf("%d ", __LINE__);
        perror("socket error");
        return -1;
    }
    // 封装服务器的地址信息结构体
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(502);
    sin.sin_addr.s_addr = inet_addr("192.168.108.128"); // 服务器IP地址
    /*//连接服务器
    if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1)
    {
        perror("connect error");
        return -1;
    }
    printf("连接服务器成功\n");*/
    // 数据收发
    unsigned char replyBuf[128] = "";
    while (1)
    {
        // 连接服务器
        if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1)
        {
            perror("connect error");
            return -1;
        }
        printf("连接服务器成功\n");
        // 将请求包发送给服务器
        if (send(sock, buf, sizeof(buf), 0) == -1)
        {
            perror("send error");
            return -1;
        }

        // 读取服务器发来的消息
        bzero(replyBuf, sizeof(replyBuf));

        int res = recv(sock, replyBuf, sizeof(replyBuf), 0);

        for (int i = 0; i < res; i++)
        {
            printf("%#02x ", replyBuf[i]);
        }

        // printf("res = %d\n",res);
        printf("\n");
        printf("res = %d\n", res);
        sleep(1);
    }
    close(sock);
    return 0;
}

6> 单寄存器数据的读取

c 复制代码
#include <myhead.h>
int main(int argc, const char *argv[])
{
    unsigned char buf[128] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x04, 0x00, 0x01, 0x00, 0x02};
    // 设置套接字
    int sock = socket(AF_INET, SOCK_STREAM, 0); 
    if (sock == -1)
    {
        printf("%d ", __LINE__);
        perror("socket error");
        return -1;
    }
    // 封装服务器的地址信息结构体
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(502);
    sin.sin_addr.s_addr = inet_addr("192.168.108.128"); // 服务器IP地址
    /*//连接服务器
    if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1)
    {
        perror("connect error");
        return -1;
    }
    printf("连接服务器成功\n");*/
    // 数据收发
    unsigned char replyBuf[128] = "";
    while (1)
    {
        // 连接服务器
        if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1)
        {
            perror("connect error");
            return -1;
        }
        printf("连接服务器成功\n");
        // 将请求包发送给服务器
        if (send(sock, buf, sizeof(buf), 0) == -1)
        {
            perror("send error");
            return -1;
        }

        // 读取服务器发来的消息
        bzero(replyBuf, sizeof(replyBuf));

        int res = recv(sock, replyBuf, sizeof(replyBuf), 0);

        for (int i = 0; i < res; i++)
        {
            printf("%#02x ", replyBuf[i]);
        }

        // printf("res = %d\n",res);
        printf("\n");
        printf("res = %d\n", res);
        sleep(1);
    }
    close(sock);
    return 0;
}

三、牛客网刷题

相关推荐
xuhaoyu_cpp_java6 小时前
项目学习(三)分页查询
java·经验分享·笔记·学习
皮皮学姐分享-ppx6 小时前
政府绿色采购数据库(2015-2024.3)
大数据·网络·数据库·人工智能·制造
W_chuanqi6 小时前
联想M7615DNA网络打印方法
网络·联想·打印机网络连接
小宋加油啊8 小时前
机械臂抓取物体 PVN3D算法调研学习
学习·算法·3d
Xzh04238 小时前
AI Agent 学习路线(Java 后端方向)
java·人工智能·学习
做cv的小昊9 小时前
计算机图形学:【Games101】学习笔记08——光线追踪(辐射度量学、渲染方程与全局光照、蒙特卡洛积分与路径追踪)
图像处理·笔记·学习·计算机视觉·游戏引擎·图形渲染·概率论
星恒随风9 小时前
C++ 类和对象入门(五):初始化列表、explicit 和 static 成员详解
开发语言·c++·笔记·学习·状态模式
HavenlonLabs10 小时前
硬件 + SaaS 产品的工程化路径:从系统架构、PCB 设计到工程样机
网络·安全·架构·系统架构·安全架构
sensen_kiss11 小时前
CPT304 SoftwareEngineeringII 软件工程 2 Pt.8 软件测试 (Software Testing)(上)
学习·软件工程
力学与人工智能11 小时前
PPT分享 | 洛桑联邦理工学院魏震:深度几何学习在工业设计优化中的应用
学习·优化·工业设计·深度几何学习·洛桑联邦理工学院