linux网络编程 --- socket实战(二)

本文档展示了如何使用C语言实现一个简单的服务器与客户端通信程序,涉及socket编程、数据结构定义及命令交互。主要关注CMD_REGISTER和CMD_GETINFO操作,以及状态码的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

common.h

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

#define SERADDR "192.168.0.104"
#define SERPORT 8080
#define BACKLOG 20

#define CMD_REGISTER 1001
#define CMD_CHECK 1002
#define CMD_GETINFO 1003

#define STATUS_OK 100
#define STATUS_ERR 101

typedef struct info
{
    char name[20];
    int age;
    int cmd;
    int status;
} INFO;

server.c

#include "common.h"

#define SERADDR "192.168.0.104"
#define SERPORT 8080

int main(int argc, char **argv)
{

    int socketfd = -1;
    struct sockaddr_in addr = {0};
    struct sockaddr_in c_addr = {0};
    socklen_t addrlen = 0;
    // socket
    socketfd = socket(AF_INET, SOCK_STREAM, 0);
    // bind
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = inet_addr(SERADDR);
    addr.sin_port = htons(SERPORT);
    int ret = bind(socketfd, (struct sockaddr *)&addr, sizeof(struct sockaddr));
    if (ret == -1)
    {
        perror("bind");
        exit(-1);
    }
    // listen
    listen(socketfd, BACKLOG);
    // accept
    int clientfd = accept(socketfd, (struct sockaddr *)&c_addr, &addrlen);
    printf("clientfd %d connetct\n", clientfd);

    INFO st;

    while (1)
    {
        memset(&st, 0, sizeof(st));
        int n_read = read(clientfd, &st, sizeof(st));
        if (n_read > 0)
        {
            if (st.cmd == CMD_REGISTER)
            {
                printf("The student message: name %s\tage %d\n", st.name, st.age);
                st.status = STATUS_OK;
            }
        }
        else
        {
            continue;
        }
        write(clientfd, &st, sizeof(st));
    }
    return 0;
}

client.c

#include "common.h"

int main(int argc, char **argv)
{
    int socketfd = -1;
    struct sockaddr_in addr = {0};
    socklen_t addrlen = 0;
    // socket
    socketfd = socket(AF_INET, SOCK_STREAM, 0);
    // connect
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = inet_addr(SERADDR);
    addr.sin_port = htons(SERPORT);

    int ret = connect(socketfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in));
    if (-1 == ret)
    {
        perror("connect");
    }

    INFO st1;
    INFO st2;

    while (1)
    {
        memset(&st1, 0, sizeof(st1));
        printf("please input student's name:");
        scanf("%s", st1.name);
        printf("please input student's age:");
        scanf("%d", &st1.age);
        st1.cmd = CMD_REGISTER;
        write(socketfd, &st1, sizeof(st1));
        printf("client send a student message\n");
        memset(&st2, 0, sizeof(st2));
        int n_read = read(socketfd, &st2, sizeof(st2));
        if (n_read > 0)
        {
            if (st2.status == STATUS_OK)
            {
                printf("register successful\n");
            }
            else
            {
                printf("register failed\n");
            }
        }
    }

    return 0;
}

运行效果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值