• 作业-11.22


    1、TCP服务器和客户端交互

            服务器

    #include
    #include
    #include
    #include
    #include
    #include
    #include

    #define ERR_MSG(msg) do{\
        fprintf(stderr, "__%d__", __LINE__);\
        perror(msg);\
    }while(0)

    #define PORT 6666
    #define IP "192.168.31.111"


    int main(int argc, const char *argv[])
    {
        int sfd = socket(AF_INET, SOCK_STREAM, 0);
        if(sfd < 0)
        {
            ERR_MSG("socket");
            return -1;
        }

        int reuse = 1;
        if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse ,sizeof(reuse)) < 0)
        {
            ERR_MSG("setsockopt");
            return -1;
        }
        printf("允许端口快速重用\n");

        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)) < 0)
        {
            ERR_MSG("bind");
            return -1;
        }

        if(listen(sfd, 128) < 0)
        {
            ERR_MSG("listen");
            return -1;
        }
        printf("服务器监听成功\n");

        struct sockaddr_in cin;
        socklen_t addrlen = sizeof(cin);

        int newfd = accept(sfd, (struct sockaddr*)&cin, &addrlen);
        if(newfd < 0)
        {
            ERR_MSG("newfd");
            return -1;
        }
        printf("newfd = %d link successful!\n", newfd);


        ssize_t res = 0;
        char buf[128] = "";
        while(1)
        {
            bzero(buf, sizeof(buf));

            res = recv(newfd, buf, sizeof(buf), 0);
            if(res < 0)
            {
                ERR_MSG("recv");
                return -1;
            }
            else if(!res)
            {
                printf("newfd = %d link close!\n", newfd);
                break;
            }

            printf("res:%ld, newfd:%d : %s\n", res, newfd, buf);

            strcat(buf, "*_*");
            if(send(newfd, buf, sizeof(buf), 0) < 0)
            {
                ERR_MSG("sen");
                return -1;
            }
            printf("send success\n");
        }

        close(newfd);
        close(sfd);

        return 0;
    }

            客户端

    #include
    #include
    #include
    #include
    #include
    #include
    #include

    #define ERR_MSG(msg) do{\
        fprintf(stderr, "__%d__:", __LINE__);\
        perror(msg);\
    }while(0)


    #define CLI_PORT 6656
    #define CLI_IP     "192.168.31.111"

    #define SER_PORT 8888
    #define SER_IP     "192.168.31.111"

    int main(int argc, const char *argv[])
    {
        int sfd = socket(AF_INET, SOCK_STREAM, 0);
        if(sfd < 0)
        {
            ERR_MSG("socket");
            return -1;
        }

        struct sockaddr_in sin;
        sin.sin_family      = AF_INET;      
        sin.sin_port        = htons(SER_PORT);  
        sin.sin_addr.s_addr = inet_addr(SER_IP);

        if(connect(sfd, (struct sockaddr*)&sin, sizeof(sin)) < 0)
        {
            ERR_MSG("connect");
            return -1;
        }
        printf("connect success\n");


        ssize_t res = 0;
        char buf[128] = "";
        
        while(1)
        {
            bzero(buf, sizeof(buf));
            //发送
            printf("请输入>>>");
            fgets(buf, sizeof(buf), stdin);
            buf[strlen(buf)-1] = 0;
            
            if(0 == strcmp("quit", buf))
            {
                printf("客户端退出\n");
                break;
            }

            if(send(sfd, buf, sizeof(buf), 0) < 0)
            {
                ERR_MSG("sen");
                return -1;
            }
            printf("send success\n");

            //接收
            res = recv(sfd, buf, sizeof(buf), 0);
            if(res < 0)
            {
                ERR_MSG("recv");
                return -1;
            }
            else if(0 == res)
            {
                printf("服务器断开连接\n");
                break;
            }
            printf(":%s\n", buf);

        }

        close(sfd);    

        return 0;
    }

     

     

    2、UDP服务器和客户端交互

            服务器

    #include
    #include
    #include
    #include
    #include
    #include
    #include

    #define ERR_MSG(msg) do{\
        fprintf(stderr, "__%d__:", __LINE__);\
        perror(msg);\
    }while(0)

    #define PORT 8888
    #define IP  "192.168.31.111"

    int main(int argc, const char *argv[])
    {
        int sfd = socket(AF_INET, SOCK_DGRAM, 0);
        if(sfd < 0)
        {
            ERR_MSG("socket");
            return -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)) < 0)
        {
            ERR_MSG("bind");
            return -1;
        }
        printf("bind success\n");

        ssize_t res = 0;
        char buf[128] = "";

        struct sockaddr_in cin;     
        socklen_t addrlen = sizeof(cin);
        

        while(1)
        {
            bzero(buf, sizeof(buf));
            res = recvfrom(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&cin, &addrlen);
            if(res < 0)
            {
                ERR_MSG("recvfrom");
                return -1;
            }
            else if(0 ==strcmp("quit", buf))
            {
                printf("link close ser close.\n");
                break;
            }
            printf("[%s:%d] : %s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), buf);

            strcat(buf, "已发送---->");
            if(sendto(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&cin, sizeof(cin)) < 0)
            {
                ERR_MSG("sendto");
                return -1;
            }
            printf("sendto success\n");

        }
        
        close(sfd);

        return 0;
    }

            客户端

    #include
    #include
    #include
    #include
    #include
    #include
    #include

    #define ERR_MSG(msg) do{\
        fprintf(stderr, "__%d__:", __LINE__);\
        perror(msg);\
    }while(0)

    #define CLI_PORT 6666
    #define CLI_IP  "192.168.31.111"

    #define SER_PORT 8888
    #define SER_IP  "192.168.31.111"

    int main(int argc, const char *argv[])
    {
        int sfd = socket(AF_INET, SOCK_DGRAM, 0);
        if(sfd < 0)
        {
            ERR_MSG("socket");
            return -1;
        }

        struct sockaddr_in cin;
        cin.sin_family      = AF_INET;      
        cin.sin_port        = htons(CLI_PORT);  
        cin.sin_addr.s_addr = inet_addr(CLI_IP);

        if(bind(sfd, (struct sockaddr*)&cin, sizeof(cin)) < 0)
        {
            ERR_MSG("bind");
            return -1;
        }
        printf("bind success\n");

        struct sockaddr_in sin;
        sin.sin_family      = AF_INET;      
        sin.sin_port        = htons(SER_PORT);  
        sin.sin_addr.s_addr = inet_addr(SER_IP);

        ssize_t res = 0;
        char buf[128] = "";

        struct sockaddr_in rcvaddr;     
        socklen_t addrlen = sizeof(rcvaddr);
        

        while(1)
        {
            bzero(buf, sizeof(buf));
            printf("请输入>>>");
            fgets(buf, sizeof(buf), stdin);
            buf[strlen(buf)-1] = 0;

            if(sendto(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&sin, sizeof(sin)) < 0)
            {
                ERR_MSG("sendto");
                return -1;
            }
            if(0 == strcmp("quit", buf))
            {
                printf("客户端退出\n");
                break;
            }
            printf("sendto success\n");

            res = recvfrom(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&rcvaddr, &addrlen);
            if(res < 0)
            {
                ERR_MSG("recvfrom");
                return -1;
            }
            printf("[%s:%d] : %s\n", inet_ntoa(rcvaddr.sin_addr), ntohs(rcvaddr.sin_port), buf);

        
        }
        close(sfd);

        return 0;
    }

     

     

  • 相关阅读:
    伪原创工具-好用的伪原创软件有哪些特征
    EfficientNet代码复现--ICML2019
    CB利用链及无依赖打Shiro
    Access denied for user ‘root‘@‘localhost‘ (using password:YES) 解决方案(禅道相关)
    VS Code快速实现Git PR操作
    操作系统4小时速成:操作系统发展和分类,运行环境:运行机制和内核,用户态非特权,核心态特权,中断技术,访管指令
    PyTorch 从tensor.grad 看 backward(权重参数) 和 gradient accumulated
    No.13软件集成技术
    冒泡排序--python(详解)
    13_C++_面向对象_1
  • 原文地址:https://blog.csdn.net/MisakaMikotto/article/details/127991743