windows下Socket通信以及数据帧解析 C语言实现

2 篇文章 0 订阅
1 篇文章 0 订阅
/*      服务器代码:主要是学习如何解析数据 */
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")

#define PORT 8888
#define MAX_BUFFER_SIZE 1024

typedef struct {
    int id;
    char data[1024];    //不清楚为什么使用指针会读不出来数据
} Employee;

typedef struct {
    char name_buff[20];
}NAME;

typedef struct
{
    char name[20];
    int age;
}AGE;

//根据ID的不同进行不同的数据转换,可以在里面添加要处理的事务
void  play_recv_value(Employee* value)
{
    NAME* liming;
    AGE* liuhua;
    if (value->id == 1)
    {
        liming=(NAME*)value->data;
        printf("%s\n", liming->name_buff);
    }
    else
    {
        liuhua = (AGE*)value->data;
        printf("name is %s ,AGE is %d\n", liuhua->name, liuhua->age);
    }
}

int main() {
    WSADATA wsa;
    SOCKET serverSocket, newSocket;
    struct sockaddr_in serverAddr, clientAddr;
    int clientAddrLen, receivedBytes;
    char buffer[MAX_BUFFER_SIZE];
    char* data_buff = (char*)malloc(100);
    Employee haha = {0};

    char response[] = "Server received employee details";
    // 初始化Winsock库
    if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) {
        printf("Failed. Error Code : %d", WSAGetLastError());
        return 1;
    }

    // 创建服务器端套接字
    if ((serverSocket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {
        printf("Could not create socket : %d", WSAGetLastError());
    }

    // 设置服务器地址和端口
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = INADDR_ANY;
    serverAddr.sin_port = htons(PORT);

    // 绑定服务器套接字
    if (bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
        printf("Bind failed with error code : %d", WSAGetLastError());
    }

    // 监听连接请求
    listen(serverSocket, 3);

    printf("Listening for incoming connections...\n");

    clientAddrLen = sizeof(clientAddr);

    // 接受客户端连接
    if ((newSocket = accept(serverSocket, (struct sockaddr*)&clientAddr, &clientAddrLen)) == INVALID_SOCKET) {
        printf("Accept failed with error code : %d", WSAGetLastError());
    }

    printf("Connection accepted\n");
    // 接收结构体数据
     Employee *employee =&haha ;
     while(1)
     { 
            receivedBytes = recv(newSocket, (char*)data_buff, sizeof(Employee), 0);

            employee = (Employee*)data_buff;
            if (receivedBytes == SOCKET_ERROR) {
                printf("Failed to receive data : %d", WSAGetLastError());
            }
            play_recv_value(employee);
            memset(data_buff, 0, sizeof(data_buff));
            // 发送回应
            send(newSocket, response, strlen(response), 0);
            Sleep(3000);
            receivedBytes= recv(newSocket, data_buff, sizeof(Employee), 0);
            if (receivedBytes == SOCKET_ERROR) {
                printf("Failed to receive data : %d", WSAGetLastError());
            }
            employee = (Employee*)data_buff;  
            play_recv_value(employee);
     }
    closesocket(newSocket);
    closesocket(serverSocket);
    WSACleanup();

    return 0;
}
/* 客户端代码:传输结构体,模拟HAED和DATA的数据结构*/
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#pragma warning(disable:4996) 
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#define SERVER_IP "127.0.0.1"
#define PORT 8888
#define MAX_BUFFER_SIZE 1024

typedef struct {
    int id;
    char data[1024];
} Employee;

typedef struct {
    char name_buff[20];
}NAME;

typedef struct
{
    char name[20];
    int age;
}AGE;

int main() {
    WSADATA wsa;
    SOCKET clientSocket;
    struct sockaddr_in serverAddr;
    int receivedBytes;
    char buffer[MAX_BUFFER_SIZE];
    AGE LIHUA;
    Employee temp;
    temp.id = 2;

    LIHUA.age = 20;
    // 初始化Winsock库
    if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) {
        printf("Failed. Error Code : %d", WSAGetLastError());
        return 1;
    }
    // 创建客户端套接字
    if ((clientSocket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {
        printf("Could not create socket : %d", WSAGetLastError());
    }

    // 设置服务器信息
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(PORT);
    serverAddr.sin_addr.s_addr = inet_addr(SERVER_IP);

    // 连接服务器
    if (connect(clientSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) {
        printf("Connect error");
        return 1;
    }

    printf("Connected\n");

    // 构造结构体数据
    Employee employee;
    NAME liming;

    strcpy_s(liming.name_buff, "LIMING");
    employee.id = 1;
    memcpy(employee.data, &liming, sizeof(liming));
    while(1)
    {
        // 发送结构体数据
        if (send(clientSocket, (char*)&employee, sizeof(Employee), 0) == SOCKET_ERROR) {
        printf("Send failed with error code : %d", WSAGetLastError());
        }
        printf("SENF  DATA SUCCESS\n");
        memset(buffer, 0, sizeof(buffer));
        // 接收回应
        receivedBytes = recv(clientSocket, buffer, sizeof(buffer), 0);
        if (receivedBytes == SOCKET_ERROR) {
        printf("Failed to receive data : %d", WSAGetLastError());
        }
        printf("Server response: %s\n", buffer);
        // 发送结构体数据
        strcpy(LIHUA.name, "Liuhua1");
        memcpy(temp.data, (char*)&LIHUA,sizeof(LIHUA));
        Sleep(5000);
        if (send(clientSocket, (char*)&temp, sizeof(Employee), 0) == SOCKET_ERROR) {
        printf("Send failed with error code : %d", WSAGetLastError());
        closesocket(clientSocket);
        WSACleanup();

        return 0;
        }
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值