封装自定义协议(简单示例)

客户端:

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

// 自定义协议的消息类型
#define MSG_TYPE_HELLO 0
#define MSG_TYPE_DATA 1
#define MSG_TYPE_GOODBYE 2

// 自定义协议的消息结构体
typedef struct {
    int type;
    int length;
    char data[1024];
} CustomMessage;

// 发送消息的函数
void send_message(int sockfd, CustomMessage *msg) {
    write(sockfd, msg, sizeof(CustomMessage));
}

// 接收消息的函数
void receive_message(int sockfd, CustomMessage *msg) {
    read(sockfd, msg, sizeof(CustomMessage));
}

int main() {
    int sockfd;
    struct sockaddr_in servaddr;

    // 创建套接字
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        perror("socket creation failed");
        exit(EXIT_FAILURE);
    }

    // 设置服务器地址和端口
    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(8080);
    servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");

    // 连接到服务器
    if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
        perror("connection with the server failed");
        exit(EXIT_FAILURE);
    }

    CustomMessage msg;

    // 发送 HELLO 消息
    msg.type = MSG_TYPE_HELLO;
    msg.length = strlen("Hello, server!") + 1;
    strcpy(msg.data, "Hello, server!");
    send_message(sockfd, &msg);

    // 接收并处理服务器的回复
    receive_message(sockfd, &msg);
    printf("Server: %s\n", msg.data);

    // 发送 DATA 消息
    msg.type = MSG_TYPE_DATA;
    msg.length = strlen("Some data from client!") + 1;
    strcpy(msg.data, "Some data from client!");
    send_message(sockfd, &msg);

    // 接收并处理服务器的回复
    receive_message(sockfd, &msg);
    printf("Server: %s\n", msg.data);

    // 发送 GOODBYE 消息
    msg.type = MSG_TYPE_GOODBYE;
    msg.length = strlen("Goodbye, server!") + 1;
    strcpy(msg.data, "Goodbye, server!");
    send_message(sockfd, &msg);

    // 关闭套接字
    close(sockfd);

    return 0;
}

服务器

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

// 自定义协议的消息类型
#define MSG_TYPE_HELLO 0
#define MSG_TYPE_DATA 1
#define MSG_TYPE_GOODBYE 2

// 自定义协议的消息结构体
typedef struct {
    int type;
    int length;
    char data[1024];
} CustomMessage;

// 发送消息的函数
void send_message(int sockfd, CustomMessage *msg) {
    write(sockfd, msg, sizeof(CustomMessage));
}

// 接收消息的函数
void receive_message(int sockfd, CustomMessage *msg) {
    read(sockfd, msg, sizeof(CustomMessage));
}

int main() {
    int listenfd, connfd;
    struct sockaddr_in servaddr, cliaddr;
    socklen_t len;

    // 创建监听套接字
    if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        perror("socket creation failed");
        exit(EXIT_FAILURE);
    }

    // 设置服务器地址和端口
    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(8080);

    // 绑定地址和端口
    if (bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1) {
        perror("bind failed");
        exit(EXIT_FAILURE);
    }

    // 监听端口
    if (listen(listenfd, 5) == -1) {
        perror("listen failed");
        exit(EXIT_FAILURE);
    }

    printf("Server listening on port 8080...\n");

    CustomMessage msg;

    while (1) {
        // 接受客户端连接
        len = sizeof(cliaddr);
        if ((connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &len)) == -1) {
            perror("accept failed");
            exit(EXIT_FAILURE);
        }

        printf("Client connected\n");

        // 接收并处理客户端的消息
        while (1) {
            receive_message(connfd, &msg);

            // 根据消息类型做出相应处理
            switch (msg.type) {
                case MSG_TYPE_HELLO:
                    printf("Client says: %s\n", msg.data);
                    // 回复客户端
                    strcpy(msg.data, "Hello, client!");
                    send_message(connfd, &msg);
                    break;
                case MSG_TYPE_DATA:
                    printf("Client sent some data: %s\n", msg.data);
                    // 回复客户端
                    strcpy(msg.data, "Data received by server!");
                    send_message(connfd, &msg);
                    break;
                case MSG_TYPE_GOODBYE:
                    printf("Client says goodbye\n");
                    // 回复客户端
                    strcpy(msg.data, "Goodbye, client!");
                    send_message(connfd, &msg);
                    // 关闭连接
                    close(connfd);
                    break;
                default:
                    printf("Unknown message type\n");
                    break;
            }

            if (msg.type == MSG_TYPE_GOODBYE) {
                break;
            }
        }
    }

    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值