当前位置:首页 > 行业动态 > 正文

c语言做上位机界面

上位机是指与下位机通信的计算机,通常用于监控和控制下位机,在C语言中,我们可以使用套接字编程来实现上位机与下位机的通信,以下是一个简单的C语言上位机程序的实现步骤:

1、引入头文件

我们需要引入一些必要的头文件,如stdio.hstdlib.hstring.hunistd.harpa.hsys/socket.h

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

2、创建套接字

接下来,我们需要创建一个套接字,在Linux系统中,可以使用socket()函数来创建套接字,套接字的类型通常为SOCK_STREAM,表示面向连接的套接字。

int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
    perror("socket");
    exit(EXIT_FAILURE);
}

3、绑定地址和端口

为了确保套接字能够被正确访问,我们需要将其绑定到一个特定的地址和端口,这里我们使用bind()函数来实现。

struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8888); // 选择一个端口号,如8888
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 绑定到本地地址
if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
    perror("bind");
    close(sockfd);
    exit(EXIT_FAILURE);
}

4、监听连接

在服务器端,我们需要监听客户端的连接请求,这里我们使用listen()函数来实现。

if (listen(sockfd, 5) < 0) {
    perror("listen");
    close(sockfd);
    exit(EXIT_FAILURE);
}

5、接受连接

当有客户端发起连接请求时,我们需要使用accept()函数来接受连接,这个函数会返回一个新的套接字,用于与客户端进行通信,它还会返回一个指向sockaddr_in结构体的指针,用于存储客户端的地址信息。

struct sockaddr_in client_addr;
socklen_t client_addr_len = sizeof(client_addr);
int newsockfd = accept(sockfd, (struct sockaddr *)&client_addr, &client_addr_len);
if (newsockfd < 0) {
    perror("accept");
    close(sockfd);
    exit(EXIT_FAILURE);
}

6、与客户端通信

现在我们已经成功地接受了一个客户端的连接,接下来就可以与客户端进行通信了,这里我们使用read()write()函数来实现数据的读取和发送,注意,我们需要将数据转换为字符串格式,并使用strlen()函数获取其长度,还需要将接收到的数据转换为字符串格式。

char buffer[1024];
char oldPath[1024] = ""; // 保存旧路径,用于回显给客户端看修改结果是否成功(可选)
char newPath[1024] = ""; // 新的路径(可选)
while (fgets(buffer, sizeof(buffer), stdin) != NULL) { // 从标准输入读取数据并发送给客户端(可选)
    int n = write(newsockfd, buffer, strlen(buffer)); // 发送数据给客户端(可选)
    if (n < 0) {
        perror("write");
        close(newsockfd);
        close(sockfd);
        exit(EXIT_FAILURE);
    } else { // 如果需要回显修改结果给客户端看(可选),则读取客户端发来的数据并打印出来(可选)
        memset(buffer, 0, sizeof(buffer)); // 清空缓冲区(可选)
        n = read(newsockfd, buffer, sizeof(buffer)); // 读取客户端发来的数据(可选)
        if (n < 0) { // 如果读取失败,则关闭套接字并退出(可选)
            perror("read"); // 打印错误信息(可选)
            close(newsockfd); // 关闭套接字(可选)
            close(sockfd); // 关闭套接字(可选)
            exit(EXIT_FAILURE); // 退出程序(可选)
        } else { // 如果读取成功,则打印出客户端发来的数据(可选)
0