作业-11.23

news2024/9/20 16:51:39

1、广播

        接收端

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

#define ERR_MSG(msg) do{\
                printf("%s:%s:%d\n", __FILE__, __func__, __LINE__);\
                perror(msg);\
            }while(0)

int main(int argc, const char *argv[])
{
    if(3 != argc){
        printf("Usage : %s <IP> <port>\n", argv[0]);
        exit(-1);
    }

    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(sockfd < 0)
    {
        ERR_MSG("socket");
        return -1;
    }

    struct sockaddr_in serveraddr;
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(atoi(argv[2]));
    serveraddr.sin_addr.s_addr = inet_addr(argv[1]);

    socklen_t serveraddr_len = sizeof(serveraddr);
    
    if(bind(sockfd, (struct sockaddr *)&serveraddr, serveraddr_len) < 0)
    {
        ERR_MSG("bind");
        return -1;
    }

    struct sockaddr_in clientaddr;
    memset(&clientaddr, 0, sizeof(clientaddr));
    socklen_t clientaddr_len = sizeof(clientaddr);

    char buf[128] = "";
    int rec_data = 0;
    int res = 0;

    while(1)
    {
        if((rec_data = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&clientaddr, &clientaddr_len)) < 0)
        {
            ERR_MSG("recvfrom");
            return -1;
        }
        if(!strncmp(buf, "quit", 4)){
            printf("客户端[%s:%d]退出了..\n", inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port));
            break;
        }
        printf("客户端[%s:%d]发来了数据[%s]\n", inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port), buf);
    }

    close(sockfd);

    return 0;
}

        发送端

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

#define ERR_MSG(msg) do{\
                printf("%s:%s:%d\n", __FILE__, __func__, __LINE__);\
                perror(msg);\
            }while(0)

int main(int argc, const char *argv[])
{
    if(3 != argc)
    {
        printf("Usage : %s <IP> <port>\n", argv[0]);
        return -1;
    }

    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(sockfd < 0)
    {
        ERR_MSG("socket");
    }

    struct sockaddr_in serveraddr;
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(atoi(argv[2]));
    serveraddr.sin_addr.s_addr = inet_addr(argv[1]);

    socklen_t serveraddr_len = sizeof(serveraddr);
    
    int value = 1;
    if(setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &value, sizeof(value)) < 0)
    {
        ERR_MSG("setsockopt");
        return -1;
    }

    char buff[128] = "";
    while(1)
    {
        printf("please enter send message>>>");
        fgets(buff, 128, stdin);
        buff[strlen(buff)-1] = '\0';

        if(sendto(sockfd, buff, 128, 0, (struct sockaddr *)&serveraddr, serveraddr_len) < 0)
        {
            ERR_MSG("send");
            return -1;
        }
        if(!strcmp(buff, "quit"))
        {
            break;
        }
    }
    close(sockfd);

    return 0;
}

        效果

 

 

2、组播

        发送端

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

#define ERR_MSG(msg) do{\
                printf("%s:%s:%d\n", __FILE__, __func__, __LINE__);\
                perror(msg);\
            }while(0)

int main(int argc, const char *argv[])
{
    if(3 != argc){
        printf("Usage : %s <IP> <port>\n", argv[0]);
        exit(-1);
    }

    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(sockfd < 0)
    {
        ERR_MSG("socket error");
        return -1;
    }

    struct sockaddr_in serveraddr;
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(atoi(argv[2]));
    serveraddr.sin_addr.s_addr = inet_addr(argv[1]);

    socklen_t serveraddr_len = sizeof(serveraddr);
    
    if(bind(sockfd, (struct sockaddr *)&serveraddr, serveraddr_len) < 0)
    {
        ERR_MSG("bind");
        return -1;
    }

    struct ip_mreqn mreqn;
    mreqn.imr_multiaddr.s_addr = inet_addr(argv[1]);
    mreqn.imr_address.s_addr = inet_addr("192.168.43.155");
    mreqn.imr_ifindex = 0;
    if(setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreqn, sizeof(mreqn)) < 0)
    {
        ERR_MSG("setsockopt");
        return -1;
    }

    struct sockaddr_in clientaddr;
    memset(&clientaddr, 0, sizeof(clientaddr));
    socklen_t clientaddr_len = sizeof(clientaddr);

    char buff[128] = "";
    int nbytes = 0;
    int ret = 0;

    while(1)
    {
        if((nbytes = recvfrom(sockfd, buff, 128, 0, (struct sockaddr *)&clientaddr, &clientaddr_len)) < 0)
        {
            ERR_MSG("recvfrom");
            return -1;
        }
        if(!strncmp(buff, "quit", 4))
        {
            printf("客户端[%s:%d]退出了..\n", inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port));
            break;
        }
        printf("客户端[%s:%d]发来了数据[%s]\n", inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port), buff);
    }

    close(sockfd);

    return 0;
}

        接收器

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

#define ERR_MSG(msg) do{\
                printf("%s:%s:%d\n", __FILE__, __func__, __LINE__);\
                perror(msg);\
            }while(0)

int main(int argc, const char *argv[])
{
    if(3 != argc){
        printf("Usage : %s <IP> <port>\n", argv[0]);
        exit(-1);
    }

    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(sockfd < 0)
    {
        ERR_MSG("socket");
        return -1;
    }

    struct sockaddr_in serveraddr;
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(atoi(argv[2]));
    serveraddr.sin_addr.s_addr = inet_addr(argv[1]);

    socklen_t serveraddr_len = sizeof(serveraddr);
    
    char buff[128] = "";
    while(1)
    {
        printf("please enter meseage>>>");
        fgets(buff, 128, stdin);
        buff[strlen(buff)-1] = '\0';

        if(sendto(sockfd, buff, sizeof(buf), 0, (struct sockaddr *)&serveraddr, serveraddr_len) < 0)
        {
            ERR_MSG("send error");
            return -1;
        }
        if(!strcmp(buff, "quit"))
        {
            break;
        }
    }
    close(sockfd);

    return 0;
}

        效果

 

        本人

                发送

 

                接收

        同学接收

 

3、fttp下载

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

#define ERR_MSG(msg) do{\
                printf("%s:%s:%d\n", __FILE__, __func__, __LINE__);\
                perror(msg);\
            }while(0)

int main(int argc, const char *argv[])
{
    if(3 != argc)
    {
        printf("Usage : %s <服务器ip地址> <服务器端口号>\n", argv[0]);
        return -1;;
    }

    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(sockfd < 0)
    {
        ERR_MSG("socket");
    }

    //操作码
    short con_num = 0;
    //块编码
    short pick_no = 0;
    //错误信息
    char error_msg[512] = {0};
    //接受数据的
    char buf[600] = {0};
    //文件名
    char filename[32] = {0};
    //文件操作符
    int fd = 0;
    int rec_pick_num = 0;

    struct sockaddr_in serveraddr;
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(atoi(argv[2]));
    serveraddr.sin_addr.s_addr = inet_addr(argv[1]);

    socklen_t serveraddr_len = sizeof(serveraddr);
    
    printf("请输入要下载的文件名:>>");
    scanf("%s", filename);

    int rec_data = sprintf(buf, "%c%c%s%c%s%c", 0, 1, filename, 0, "octet", 0);

    if(sendto(sockfd, buf, rec_data, 0, (struct sockaddr *)&serveraddr, serveraddr_len) < 0)
    {
        ERR_MSG("sendto error");
        return -1;
    }

    while(1)
    {
        if((rec_data = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&serveraddr, &serveraddr_len)) < 0)
        {
            ERR_MSG("recvfrom");
            return -1;
        }

        con_num = ntohs(*(short *)buf);
        pick_no = ntohs(*(short *)(buf+2));
        strncpy(error_msg, buf+4, rec_data-4);
        
        if(con_num == 5)
        {
            printf("errno = [%d]  errstr = [%s]\n", pick_no, error_msg);
            return -1;
        }else if(con_num == 3 && rec_pick_num+1 == pick_no)
        {
            rec_pick_num++;
            if(pick_no == 1)
            {
                if((fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC, 0664)) < 0)
                {
                    ERR_MSG("open");
                    return -1;
                }
            }
            if(write(fd, error_msg, rec_data-4) < 0)
            {
                ERR_MSG("write");
                return -1;
            }

            *(short *)buf = htons(4);
            *(short *)(buf+2) = htons(pick_no);

            if(sendto(sockfd, buf, 4, 0, (struct sockaddr *)&serveraddr, serveraddr_len) < 0)
            {
                ERR_MSG("sendto");
                return -1;
            }

            if(rec_data-4 < 512)
            {
                break;
            }
        }
    }

    close(fd);
    printf("文件[%s]下载完成..\n", filename);
    close(sockfd);

    return 0;
}

        效果

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/31170.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Diffusion Autoencoders: Toward a Meaningful and Decodable Representation

​ Diffusion Autoencoders: Toward a Meaningful and Decodable Representation 扩散自编码器:面向有意义和可解码的表示 code&#xff1a;https://github.com/phizaz/diffae A CVPR 2022 (ORAL) paper (paper, site, 5-min video) Diffusion probabilistic models (DPMs) hav…

算法设计与分析 SCAU17089 最大m子段和

17089 最大m子段和 时间限制:1000MS 代码长度限制:10KB 提交次数:0 通过次数:0 题型: 编程题 语言: G;GCC;VC;JAVA Description “最大m子段和”问题&#xff1a;给定由n个整数&#xff08;可能为负&#xff09;组成的序列a1、a2、a3、…、an&#xff0c;以及一个正整数m&a…

【Java】初识IO流【附导航】

文章目录01 什么是IO02 数据源03 什么是流04 IO流原理⇩➩ 导航01 什么是IO 对于任何程序设计语言而言&#xff0c;输入输出&#xff08;Input / Output&#xff09;系统都是非常核心的功能。程序运行需要数据&#xff0c;数据的获取往往需要跟系统外部进行通信&#xff0c;外部…

论文复现|Panoptic Deeplab(全景分割PyTorch)

摘要&#xff1a;这是发表于CVPR 2020的一篇论文的复现模型。本文分享自华为云社区《Panoptic Deeplab(全景分割PyTorch)》&#xff0c;作者&#xff1a;HWCloudAI 。 这是发表于CVPR 2020的一篇论文的复现模型&#xff0c;B. Cheng et al, “Panoptic-DeepLab: A Simple, Str…

63. 不同路径 II

题目 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。 现在考虑网格中有障碍物。那么从左上角到…

MySQL主/从-主/主集群安装部署

MySQL集群架构的介绍 我们在使用到MySQL数据库的时候&#xff0c;只是一个单机的数据库服务。在实际的生产环境中&#xff0c;数据量可能会非常庞大&#xff0c;这样单机服务的MySQL在使用的时候&#xff0c;性能会受到影响影响。并且单机服务的MySQL的数据安全性也会受到影响…

数字信号处理-09-串行FIR滤波器MATLAB与FPGA实现

前言 本文介绍了设计滤波器的FPGA实现步骤&#xff0c;并结合杜勇老师的书籍中的串行FIR滤波器部分进行一步步实现硬件设计&#xff0c;对书中的架构做了简单的优化&#xff0c;并进行了仿真验证。 FIR滤波器的FPGA实现步骤 从工程角度分析FIR滤波器的FPGA实现步骤如下&…

Vim简洁教程

Vim简洁教程Vim简介使用方法命令模式输入模式底线命令模式模式转换使用流程Vim键盘图Vim简介 在Linux系统中&#xff0c;Vim是一款自带的文本编辑器&#xff0c;因此Vim常用于Linux系统中。Vim是从 vi 发展出来的&#xff0c;包含代码补全、编译及错误跳转等方便编程的功能&am…

【LeetCode每日一题】——78.子集

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 数组 二【题目难度】 中等 三【题目编号】 78.子集 四【题目描述】 给你一个整数数组 nums &…

亚太C题详细版思路修改版(精)

今年的亚太A、B题的感觉难度不低&#xff0c;其难度已经可以与电工妈杯这种比赛的赛题难度相提并论了。因此&#xff0c;这次预计选C题的人数可能不少&#xff0c;这对于大家来说也是个好消息。塞翁失马焉知非福&#xff0c;难对于大家来说都难&#xff0c;只要自己放平心态&am…

计算机组成原理习题课第一章-1(唐朔飞)

计算机组成原理习题课第一章-1&#xff08;唐朔飞&#xff09; ✨欢迎关注&#x1f5b1;点赞&#x1f380;收藏⭐留言✒ &#x1f52e;本文由京与旧铺原创&#xff0c;csdn首发&#xff01; &#x1f618;系列专栏&#xff1a;java学习 &#x1f4bb;首发时间&#xff1a;&…

【Pygame实战】这游戏有毒,刷爆朋友圈:小编已与病毒版贪吃蛇大战了三百回合,最高分339?

导语 Hello&#xff0c;大家好呀&#xff01;我是木木子吖&#xff5e; 一个集美貌幽默风趣善良可爱并努力码代码的程序媛一枚。 听说关注我的人会一夜暴富发大财哦~ &#xff08;哇哇哇 这真的爱&#x1f60d;&#x1f60d;&#xff09; 所有文章完整的素材源码都在&#…

Android中JVM七大垃圾收集器【解析】

概述 GC垃圾收集器的种类 新生代&#xff1a;年轻代用来存放最近创建的对象老年代&#xff1a;主要存放应用程序中生命周期长的内存对象永久代&#xff1a;内存的永久保存区域&#xff08;类和元数据&#xff09;&#xff0c;GC不参与回收Serial收集器&#xff1a;串行收集器…

web网页设计—— 中国餐饮协会(HTML+CSS)

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

CentOS8使用阿里云yum源异常问题及解决方法

镜像下载、域名解析、时间同步请点击 阿里云开源镜像站 Linux安装git时发生如下错误 [rootraoyuuuu maven]# dnf install git Repository extras is listed more than once in the configuration Repository epel is listed more than once in the configuration CentOS-8 - B…

关于windows的文件监控管理系统(Java)

目 录 摘 要 I Abstract II 1.绪论 1 1.1课题背景 1 1.2系统开发的目的和意义 2 1.3国内外概况 3 1.4研究主要内容 3 2.windows文件监控管理系统相关技术介绍 4 2.1 API 4 2.2 API HOOK 5 2.3 Java 5 2.4 DLL 6 2.4 Windows系统的Socket编程 6 2.4.1使用WinSock API 6 2.4.2 使…

【 C++ 】IO流

目录 1、C语言的输入输出 2、流是什么 3、CIO流 3.1、C标准IO流 3.2、C文件IO流 文件操作步骤 以二进制的形式操作文件 以文本的形式操作文件 4、stringstream的介绍 1、C语言的输入输出 C语言中我们用到的最频繁的输入输出方式就是scanf()和printf()。 scanf()&#xff1a…

[前端基础] JavaScript 基础篇(下)

DOM 和 BOM DOM 指的是文档对象模型&#xff0c;它指的是把文档当做一个对象来对待&#xff0c;这个对象主要定义了处理网页内容的方法和接口。BOM 指的是浏览器对象模型&#xff0c;它指的是把浏览器当做一个对象来对待&#xff0c;这个对象主要定义了与浏览器进行交互的法和…

Node核心模块之Stream

Node.js诞生之初就是为了提高IO性能&#xff0c;文件操作系统和网络模块实现了流接口&#xff0c;Node.js中流就是处理流式数据的抽象接口。 那么应用程序为什么使用流来处理数据&#xff1f; 常见问题 同步读取资源文件&#xff0c;用户需要等待数据读取完成资源文件最终一次…

【Windows】windows10时间显示秒数

一般情况下windows10的电脑时间只显示小时和分钟&#xff0c;但是有的用户想要时间显示更加精细&#xff0c;那么windows10时间怎么显示秒呢&#xff1f;大家可以通过修改注册表的方式进行设置&#xff1a;打开注册表编辑器&#xff0c;定位到Advanced&#xff0c;右键新建DWOR…