Linux socket服务器

服务器接收客户端发送过来的数据流,且以结构体解析案例

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

#define INVALID_SOCKET -1
#define SOCKET_ERROR -1

struct Header
{
    unsigned int Makelength; 
    unsigned int Modellength;
};

struct CarData {
    int Vin; //Unique Vehicle ID
    char* Make; //A string containing the make of the car
    char* Model; //A string containing the model of the car
    float MSRP; //Suggest Manufacturers Retail Price in $
};

struct packet {
    struct CarData car;
    struct Header Head;
};

void DeserializeCarData(char* RxBuffer, struct packet* pkt) {
    memcpy(&pkt->Head, RxBuffer, sizeof(pkt->Head));

    pkt->car.Make = (char*)malloc(pkt->Head.Makelength); 
    pkt->car.Model = (char*)malloc(pkt->Head.Modellength); 

    if (pkt->car.Make == NULL || pkt->car.Model == NULL)
    {
        exit(EXIT_FAILURE);
    }

    memcpy(&pkt->car.Vin, RxBuffer + sizeof(pkt->Head), sizeof(pkt->car.Vin));
    memcpy(pkt->car.Make, RxBuffer + sizeof(pkt->Head) + sizeof(pkt->car.Vin), pkt->Head.Makelength - 1);
    pkt->car.Make[pkt->Head.Makelength - 1] = '\0';
    memcpy(pkt->car.Model, RxBuffer + sizeof(pkt->Head) + sizeof(pkt->car.Vin) + pkt->Head.Makelength, pkt->Head.Modellength - 1);
    pkt->car.Model[pkt->Head.Modellength - 1] = '\0';
    memcpy(&pkt->car.MSRP, RxBuffer + sizeof(pkt->Head) + sizeof(pkt->car.Vin) + pkt->Head.Makelength + pkt->Head.Modellength, sizeof(pkt->car.MSRP));
}

int main()
{
    
    struct sockaddr_in SvrAddr;
    int WelcomeSocket, ConnectionSocket;

    //Data buffers
    char RxBuffer[128] = {};

    //create welcoming socket at port and bind local address
    if ((WelcomeSocket = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
    {
        printf("ERROR:  Failed to create WelcomeSocket\n");
        return 0;
    }

    SvrAddr.sin_family = AF_INET;
    SvrAddr.sin_addr.s_addr = INADDR_ANY;
    SvrAddr.sin_port = htons(27000);

    if ((bind(WelcomeSocket, (struct sockaddr*)&SvrAddr, sizeof(SvrAddr))) == SOCKET_ERROR)
    {
        printf("ERROR:  Failed to bind WelcomeSocket\n");
        close(WelcomeSocket);
        return 0;
    }

    //Specify the maximum number of clients that can be queued
    if (listen(WelcomeSocket, 1) == SOCKET_ERROR)
    {
        printf("ERROR:  Failed to start Listening Port\n");
        close(WelcomeSocket);
        return 0;
    }
   
    printf("Waiting for client connection\n");
    ConnectionSocket = SOCKET_ERROR;
   

    while (1)
    {
        
        //wait for an incoming connection from a client
        if ((ConnectionSocket = accept(WelcomeSocket, NULL, NULL)) == SOCKET_ERROR)
        {
            printf("oops!  Something went wrong\n");
            return 0;
            
        }
        else
        {
            printf("Connection Established\n");

            /***********************************
            * TBD - Insert your Lab 6 code here*
            ************************************/

            while (1) {
                // 1. empty RxBuffer
                memset(RxBuffer, 0, sizeof(RxBuffer));

                // 2. receive RxBuffer
                int numBytesRecv = recv(ConnectionSocket, RxBuffer, sizeof(RxBuffer), 0);
                if (numBytesRecv == SOCKET_ERROR || numBytesRecv == 0) {
                    break; // Connection closed or error
                }

                struct packet pkt;
                DeserializeCarData(RxBuffer, &pkt);

                // Check if Vin is 0, if so, break the loop
                if (pkt.car.Vin == 0) {
                    break;
                }

                printf("VIN: %d\n", pkt.car.Vin);
                printf("make of the car: %s\n", pkt.car.Make);
                printf("model of the car: %s\n", pkt.car.Model);
                printf("Retail Price: %.2f\n", pkt.car.MSRP);

                free(pkt.car.Make);
                free(pkt.car.Model);
            }

            close(ConnectionSocket);
        }
    }
    close(ConnectionSocket);
    return 1;
}
 

相关推荐

  1. 租用服务器提供服务

    2024-03-16 01:54:02       32 阅读
  2. RHCE 【DNS服务主从服务器

    2024-03-16 01:54:02       60 阅读
  3. 服务器自启动服务总结

    2024-03-16 01:54:02       82 阅读
  4. 服务器固件

    2024-03-16 01:54:02       52 阅读
  5. 边缘服务器

    2024-03-16 01:54:02       42 阅读
  6. 物理服务器

    2024-03-16 01:54:02       60 阅读
  7. 初始化服务器

    2024-03-16 01:54:02       58 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-16 01:54:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-16 01:54:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-16 01:54:02       87 阅读
  4. Python语言-面向对象

    2024-03-16 01:54:02       96 阅读

热门阅读

  1. HDOJ 2050

    2024-03-16 01:54:02       40 阅读
  2. 前端面试练习24.3.15

    2024-03-16 01:54:02       36 阅读
  3. C++/CLI学习笔记1(快速打通c++与c#相互调用的桥梁)

    2024-03-16 01:54:02       42 阅读
  4. Android13 客制化U盘挂载路径

    2024-03-16 01:54:02       39 阅读
  5. ArrayList 是线程安全的么?

    2024-03-16 01:54:02       42 阅读
  6. R在直方图上添加一个更平滑的密度曲线

    2024-03-16 01:54:02       39 阅读
  7. JVM配置调优

    2024-03-16 01:54:02       45 阅读
  8. C语言程序设计(第四版)—习题11程序设计题

    2024-03-16 01:54:02       38 阅读
  9. PID、LQR、MPC三者的原理及区别

    2024-03-16 01:54:02       90 阅读
  10. mybatis转义字符

    2024-03-16 01:54:02       45 阅读