网络编程DAY3

1.用多进程实现TCP并发服务器

#include 
#define PORT 9999
#define IP "192.168.125.14"

// 信号处理函数
void handel(int signo)
{
    if (signo == SIGCHLD) {
        while (waitpid(-1, NULL, WNOHANG) > 0)
            ;
    }
}

// 操作函数
int dows(int newfd, struct sockaddr_in cin)
{

    // 5收发数据
    char rbuf[128] = "";
    while (1) {
        bzero(rbuf, sizeof(rbuf));
        int res = 0;
        res = recv(newfd, rbuf, sizeof(rbuf), 0);
        if (res == 0) {
            printf("客户端退出\n");
            break;
        }
        printf("[%s:%d] : %s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), rbuf);
        strcat(rbuf, "*-*");
        send(newfd, rbuf, sizeof(rbuf), 0);
    }
    close(newfd);
    return 0;
}
int main(int argc, const char* argv[])
{

    // 将信号绑定
    if (signal(SIGCHLD, handel) == SIG_ERR) {
        perror("signal error");
        return -1;
    }
    // 1创建套接字文件
    int sfd = -1;
    if ((sfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        perror("socket perror");
        return -1;
    }
    // 2绑定IP 端口
    // 2.1定义结构体信息
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(PORT);
    sin.sin_addr.s_addr = inet_addr(IP);
    if (bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) == -1) {
        perror("bind error");
        return -1;
    }
    printf("bind success\n");
    // 3监听
    if (listen(sfd, 128) == -1) {
        perror("listen error");
        return -1;
    }
    printf("listen success\n");
    // 4接受请求
    // 4.1定义结构体 接收客户端信息
    struct sockaddr_in cin;
    socklen_t socklen = sizeof(cin);
    // 定义进称号;
    pid_t pid = -1;
    int newfd = -1;
    while (1) {
        if ((newfd = accept(sfd, (struct sockaddr*)&cin, &socklen)) == -1) {
            perror("accept error");
            return -1;
        }
        printf("[%s:%d] 连接成功,newfd = %d\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), newfd);
        pid = fork();
        // 父进程接收请求
        if (pid > 0) {
            close(newfd);
        }
        // 子进程回应
        else if (pid == 0) {
            close(sfd);
            dows(newfd, cin);
            close(newfd);
            exit(EXIT_SUCCESS);
        } else {
            perror("fork error");
            return -1;
        }
    }
    close(sfd);
    return 0;
}

网络编程DAY3_第1张图片

2.用多线程完成TCP并发服务器

#include 
#define PORT 9999
#define IP "192.168.125.14"

//定义传参的结构体
struct phtread_ds
{
    int newfd;
    struct sockaddr_in cin;
};

// 线处理函数
void* dows(void* arg)
{
    //分解结构体
    int newfd = ((struct phtread_ds *)arg)->newfd;
    struct sockaddr_in cin = ((struct phtread_ds *)arg)->cin;
    // 5收发数据
    char rbuf[128] = "";
    while (1) {
        bzero(rbuf, sizeof(rbuf));
        int res = 0;
        res = recv(newfd, rbuf, sizeof(rbuf), 0);
        if (res == 0) {
            printf("客户端退出\n");
            break;
        }
        printf("[%s:%d] : %s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), rbuf);
        strcat(rbuf, "*-*");
        send(newfd, rbuf, sizeof(rbuf), 0);
    }
    pthread_exit(NULL);
}
int main(int argc, const char* argv[])
{
    // 1创建套接字文件
    int sfd = -1;
    if ((sfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        perror("socket perror");
        return -1;
    }
    //端口号快速重用
    int reuse = 1;
    if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse))==-1)
    {
        perror("setsockopt error");
        return -1;
    }
    // 2绑定IP 端口
    // 定义结构体信息
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(PORT);
    sin.sin_addr.s_addr = inet_addr(IP);
    if (bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) == -1) {
        perror("bind error");
        return -1;
    }
    printf("bind success\n");
    // 3监听
    if (listen(sfd, sizeof(sin)) == -1) {
        perror("listen error");
        return -1;
    }
    printf("listen success\n");
    // 4接受请求
    // 定义结构体 接收客户端信
    struct sockaddr_in cin;
    socklen_t socklen = sizeof(cin);
    int newfd = -1;
    // 定义线程号
    pthread_t tid = -1;
    while (1) {
        if ((newfd = accept(sfd, (struct sockaddr*)&cin, &socklen)) == -1) {
            perror("accept error");
            return -1;
        }
        printf("[%s:%d] 连接成功,newfd = %d\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), newfd);
        struct phtread_ds info={newfd,cin};
        if (pthread_create(&tid, NULL, dows, &info) != 0) {
            perror("create error");
            return -1;
        }
    }
    pthread_detach(tid);
    return 0;
}

网络编程DAY3_第2张图片

3.机械臂项目

#include 
#define SERPORT 8888
#define SERIP "192.168.125.247"
int main(int argc, const char* argv[])
{
    // 1创建用于通信的套接子
    int cfd = -1;
    if ((cfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        perror("socket error");
        return -1;
    }
    // 2绑定或不绑定
    // 3连接服务器
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(SERPORT);
    sin.sin_addr.s_addr = inet_addr(SERIP);
    // 3.2
    if (connect(cfd, (struct sockaddr*)&sin, sizeof(sin)) == -1) {
        perror("connect error");
        return -1;
    }
    printf("success\n");
    // 4收发
    //红色臂
    char rbuf[5] = { 0xff, 0x02, 0x00, 0x00, 0xff };
    send(cfd, rbuf, sizeof(rbuf), 0);//初始化
    //蓝色臂
    unsigned char bbuf[5] = { 0xff, 0x02, 0x01, 0x00, 0xff };
    send(cfd, bbuf, sizeof(bbuf), 0);//初始化
    char value = 0;
    while (1) {
        value = getchar();
        switch (value) {
        case 'W':
        case 'w': {
            rbuf[3] += 2;//增大红色臂角度
            if (rbuf[3] >= 90) {
                rbuf[3] = 90;
            }
            send(cfd, rbuf, sizeof(rbuf), 0);
            break;
        }
        case 'S':
        case 's': {
            rbuf[3] -= 2;//减小
            if (rbuf[3] <= -90) {
                rbuf[3] = -90;
            }
            send(cfd, rbuf, sizeof(rbuf), 0);
            break;
        }
        case 'A':
        case 'a': {
            bbuf[3] += 5;//增大蓝色臂角度
            if (bbuf[3] >= 180) {
                bbuf[3] = 180;
            }
            send(cfd, bbuf, sizeof(bbuf), 0);
            break;
        }
        case 'D':
        case 'd': {
            bbuf[3] -= 5;//减小
            if (bbuf[3] <= 0) {
                bbuf[3] = 0;
            }
            send(cfd, bbuf, sizeof(bbuf), 0);
            break;
        }
        }
    }

    // 关闭
    close(cfd);
    return 0;
}

网络编程DAY3_第3张图片

网络编程DAY3_第4张图片

你可能感兴趣的:(网络,linux)