多进程服务程序设计

客户端代码:

#include <stdio.h>

#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define PORT 5555
#define SERVER_IP "127.0.0.1"

typedef struct mathopt{
    int type;
    float num1;
    float num2;
}mopt;

void create_mopt(struct mathopt *send_mopt);

int main()
{
    int rv;
    int client_sock;
    struct sockaddr_in ser_addr;
    char command[10];
    char recvbuf[100];

    client_sock = socket(AF_INET, SOCK_STREAM, 0);
    if(client_sock < 0)
    {
        printf("socket error:%s\n", strerror(errno));
        exit(0);
    }

    ser_addr.sin_family = AF_INET;
    ser_addr.sin_port = htons(PORT);
    ser_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
    rv = connect(client_sock, (struct sockaddr*)&ser_addr, sizeof(ser_addr));
    if(rv < 0)
    {
        printf("connect error:%s\n", strerror(errno));
        exit(0);
    }
    printf("connect success\n");
    
    while(1)
    {
        memset(command, 0, sizeof(command));
        struct mathopt send_mopt;
        printf("input your command>");
        scanf("%s", command);
        if(strcmp(command, "add") == 0)
        {
            send_mopt.type = 1;
            create_mopt(&send_mopt);    
        }
        else if(strcmp(command, "quit") == 0)
        {
            send_mopt.type = 4;
        }

        send(client_sock, (char*)&send_mopt, sizeof(send_mopt), 0);

        if(4 == send_mopt.type)
        {
            break;
        }    
    
        memset(recvbuf, 0, sizeof(recvbuf));
        recv(client_sock, recvbuf, sizeof(recvbuf), 0);
        printf("the result is:%s\n", recvbuf);    
        
        

    }
    
    close(client_sock);
    
    exit(0);
}


void create_mopt(struct mathopt *send_mopt)
{
    printf("input num1>");
    scanf("%f", &(send_mopt->num1));

    printf("input num2>");
    scanf("%f", &(send_mopt->num2));

}

------------------------------

服务端代码:

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

#define PORT 5555

typedef struct mathopt{
    int type;
    float num1;
    float num2;
}mopt;

void processchild(int client);

int main()
{
    struct sockaddr_in ser_addr;
    struct sockaddr_in client_addr;
    int client_len = sizeof(client_addr);
    int ser_sock;
    int rv;
    int opt;
    
    ser_sock = socket(AF_INET, SOCK_STREAM, 0);    
    if(ser_sock < 0)
    {
        printf("socket error:%s\n", strerror(errno));
        exit(0);
    }
    
    opt = SO_REUSEADDR;
    rv = setsockopt(ser_sock, SOL_SOCKET, opt, &opt, sizeof(opt));
    if(rv < 0)
    {
        printf("setsockopt error:%s\n", strerror(errno));
        exit(0);
    }
    
    ser_addr.sin_family = AF_INET;
    ser_addr.sin_port = htons(PORT);
    ser_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    rv = bind(ser_sock, (struct sockaddr*)&ser_addr, sizeof(ser_addr));
    if(rv < 0)
    {
        printf("bind error:%s\n", strerror(errno));
        exit(0);
    }

    rv = listen(ser_sock, 5);
    if(rv < 0)
    {
        printf("listen error:%s\n", strerror(errno));
        exit(0);
    }

    while(1)
    {
        int client = accept(ser_sock, (struct sockaddr*)&client_addr, (socklen_t*)&client_len);
        if(client < 0)
        {
            printf("accept error:%s\n", strerror(errno));
            continue;
        }

        pid_t p_id = fork();
        if(p_id > 0)
        {
            close(client);
            continue;
        }    
        else if(p_id == 0)
        {
            close(ser_sock);
            processchild(client);
            exit(0);
        }
        else
        {
            printf("fork error:%s\n", strerror(errno));
            exit(0);
        }


    }

    
    

    close(ser_sock);
    exit(0);
}

void processchild(int client)
{
    ssize_t len;
    char sendbuf[100];
    char recvbuf[1024];
    while(1)
    {
        memset(recvbuf, 0, sizeof(recvbuf));
        len = recv(client, recvbuf, sizeof(recvbuf), 0);    
        if(len < sizeof(struct mathopt))
        {
            break;
        }

        struct mathopt *recv_mopt = (struct mathopt*)recvbuf;
        memset(sendbuf, 0, sizeof(sendbuf));
        if(1 == recv_mopt->type)
        {
            float result = recv_mopt->num1 + recv_mopt->num2;
            sprintf(sendbuf, "%f", result);
        }
        else if(4 == recv_mopt->type)
        {
            break;
        }

        len = send(client, sendbuf, sizeof(sendbuf), 0);    
        if(len < 0)
        {
            break;
        }

    }
    
    close(client);
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值