2024.8.12 作业

news2024/11/16 4:45:47

TCP服务器端代码实现

#include <myhead.h>
#define SER_PORT 6666
#define SER_IP "192.168.254.129"
int main(int argc,const char *argv[])
{
    //1.创建套接字文件
    int sfd = socket(AF_INET,SOCK_STREAM,0);
    if(sfd==-1)
    {
        perror("socket error");
        return -1;
    }       
    printf("socket success,sfd = %d\n",sfd);

    //将端口号快速重用
    int reuse = 1;
    if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1)
    {
        perror("setsockopt error");
        return -1;
    }
    printf("端口号快速重用成功\n");
    
    //2.为套接字绑定ip地址和端口号
    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(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.阻塞等待客户端的连接请求
    struct sockaddr_in cin;
    socklen_t addrlen = sizeof(cin);
    int newfd = accept(sfd,(struct sockaddr *)&cin,&addrlen);
    if(newfd==-1)
    {
        perror("accept error");
        return -1;
    }
    printf("[%s:%d]已成功连接一个客户端\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));

    //数据收发
    char buf[128]="";
    while(1)
    {
        memset(buf,0,sizeof(buf));
        int res = recv(newfd,buf,sizeof(buf),0);
        if(res==-1)
        {
            perror("read error");
            return -1;
        }
        else if(res==0)
        {
            printf("客户端已经下线\n");
            close(newfd);
            break;
        }
        printf("[%s:%d] : %s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buf);
        strcat(buf,"*_*");
        if(send(newfd,buf,strlen(buf),0)==-1)
        {
            perror("发送失败");
            return -1;
        }
        printf("发送成功\n");
    }
    close(sfd);
    return 0;
}

TCP客户端实现

#include <myhead.h>
#define SER_PORT 6666
#define SER_IP "192.168.254.129"
#define CLI_PORT 8888
#define CLI_IP "192.168.254.129"
int main(int argc,const char *argv[])
{
    //1.创建用于通信的套接字文件描述符
    int cfd = socket(AF_INET,SOCK_STREAM,0);
    if(cfd==-1)
    {
        perror("socket error");
        return -1;
    }
    printf("cfd = %d\n",cfd);

    //2.绑定IP地址和端口号
    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(cfd,(struct sockaddr *)&cin,sizeof(cin))==-1)
    {
        perror("bind error");
        return -1;
    }
    printf("bind success\n");

    //3.连接到服务器
    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(cfd,(struct sockaddr *)&sin,sizeof(sin))==-1)
    {
        perror("connect error");
        return -1;
    }
    printf("连接服务器成功\n");

    //4.数据收发
    char buf[128]="";
    while(1)
    {
        printf("请输入>>>");
        fgets(buf,sizeof(buf),stdin);
        buf[strlen(buf)-1]=0;
        send(cfd,buf,strlen(buf),0);
        printf("发送成功\n");
        memset(buf,0,sizeof(buf));
        recv(cfd,buf,sizeof(buf),0);
        printf("收到服务器消息为:%s\n",buf);
    }

    //5.关闭套接字
    close(cfd);
    return 0;
}

UDP服务器端实现

#include <myhead.h>
#define SER_PORT 9999
#define SER_IP "192.168.254.129"
int main(int argc,const char *argv[])
{
    //1.创建用于通信的服务器套接字文件描述符
    int sfd = socket(AF_INET,SOCK_DGRAM,0);
    if(sfd==-1)
    {
        perror("socket error");
        return -1;
    }

    //将端口号快速重用
    int reuse = 1;
    if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1)
    {
        perror("reuse error");
        return -1;
    }
    printf("端口号快速重用成功\n");

    //2.为套接字绑定ip地址和端口号
    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(bind(sfd,(struct sockaddr *)&sin,sizeof(sin))==-1)
    {
        perror("bind error");
        return -1;
    } 
    printf("bind success\n");

    //3.数据收发
    char buf[128]="";
    struct sockaddr_in cin;
    socklen_t addrlen = sizeof(cin);
    while(1)
    {
        memset(buf,0,sizeof(buf));
        recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr *)&cin,&addrlen);
        printf("收到的消息为:%s\n",buf);
        strcat(buf,"*_*");
        if(sendto(sfd,buf,strlen(buf),0,(struct sockaddr *)&cin,sizeof(cin))==-1)
        {
            perror("发送error");
            return -1;
        }
        printf("发送成功\n");
    }
    close(sfd);
    return 0;
}

UDP客户端实现

#include <myhead.h>
#define SER_PORT 9999
#define SER_IP "192.168.254.129"
#define CLI_PORT 5555
#define CLI_IP "192.168.254.129"
int main(int argc,const char *argv[])
{
    //1.创建用于通信的服务器套接字文件描述符
    int cfd = socket(AF_INET,SOCK_DGRAM,0);
    if(cfd==-1)
    {
        perror("socket error");
        return -1;
    }

    //将端口号快速重用
    int reuse = 1;
    if(setsockopt(cfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1)
    {
        perror("reuse error");
        return -1;
    }
    printf("端口号快速重用成功\n");

    //2.为套接字绑定ip地址和端口号
    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(cfd,(struct sockaddr *)&cin,sizeof(cin))==-1)
    {
        perror("bind error");
        return -1;
    } 
    printf("bind success\n");

    //3.数据收发
    char buf[128]="";
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(SER_PORT);
    sin.sin_addr.s_addr = inet_addr(SER_IP);
    while(1)
    {
        printf("请输入>>>");
        fgets(buf,sizeof(buf),stdin);
        buf[strlen(buf)-1]=0;
        if(sendto(cfd,buf,strlen(buf),0,(struct sockaddr *)&sin,sizeof(sin))==-1)
        {
            perror("发送error");
            return -1;
        }
        printf("发送成功\n");
        memset(buf,0,sizeof(buf));
        recvfrom(cfd,buf,sizeof(buf),0,NULL,NULL);
        printf("收到服务器消息为:%s\n",buf);
    }
    close(cfd);
    return 0;
}

思维导图

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

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

相关文章

Echarts-GL和three.js对比,实力在一个档次么?

我们都知道echarts非常好用&#xff0c;简单配置就可以实现各式各样的图表下过&#xff0c;echarts有一个扩展叫echarts-GL&#xff0c;可以实现三维图表效果&#xff0c;那么和three.js相比呢&#xff1f; 一、Echarts-GL的来源 ECharts-GL 是百度开源的一款基于 WebGL 的数据…

PMP和PMI-ACP 考哪个证书好,还是两个都考?

PMP是一个由美国项目管理协会&#xff08;PMI&#xff09;发起的项目管理专业人士或专家资格认证&#xff0c;它评估从业者领导和引导项目团队的能力。PMP在中国早已推广&#xff0c;基于系统项目管理的框架体系&#xff0c;是项目管理领域的基本要求。这个证书知名度很高&…

为什么要加强产供协同管理?可以从哪些方面提高产供协同效率?

随着市场竞争的加剧和客户需求的多变&#xff0c;企业之间的竞争已经转变为供应链之间的竞争。在这一背景下&#xff0c;产供协同管理显得尤为重要。本文将概述加强产供协同管理的必要性&#xff0c;探讨其在提升企业响应速度、优化库存、增强客户满意度和降低成本方面的作用&a…

【数学建模备赛】Ep02:TOPSIS模型(优劣解距离法)

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、TOPSIS法&#xff1a;☀️☀️☀️1. 引入&#xff08;综合类评价问题&#xff09;1.1 分析层次分析法的局限1.2 小例子①给出评分类比权重②构造计算评分的公式③解释④拓展问题&#xff08;增加指标个数&#x…

JVM知识总结(类加载器)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 类加载器 Bootstrap引导类加载器 引导类加载器也被称为启动类加载…

计算机系统基础知识:数据表示及运算

计算机系统基础知识 1. 计算机系统基本组成2. 数据表示及运算2.1 数据表示进位计数值及其转换机器数和码制定点数和浮点数十进制编码ASCII码汉字编码Unicode 2.2 校验码2.3 逻辑代数及运算2.4 机器数的运算机器数的加减运算机器数的乘除运算浮点运算 1. 计算机系统基本组成 计…

opencv-python图像增强二:图像去雾(暗通道去雾)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、简介&#xff1a;二、暗通道去雾方案简述&#xff1a;三、算法实现步骤3.1最小值滤波3.2 引导滤波3.3 计算图像全局光强 四&#xff1a;整体代码实现五&#xf…

iLight混合点光源 激光与LED技术的结合

51camera机器视觉产品资料查询平台的光源种类比较丰富&#xff0c;今天我们一起来看看其合作厂商iCore的明星产品iLight混合点光源&#xff0c;该产品提供了比LED更高的亮度&#xff0c;作为传统LED和氙气灯的替代品&#xff0c;它将激光和LED技术的结合&#xff0c;提供了长达…

创建vscode debug环境

c语言或者其他语言在 字符串指针使用细节很多&#xff0c;你不能编译整个镜像下载在设备里来调试。这些在一个.c文件里需要验证的细节&#xff0c;可以在vscode里创建一个main函数调试 1&#xff0c;环境创建 主要参考下面链接&#xff1a; 如何在VScode中让printf输出中文…

【项目】基于Vue2+Router+Vant 前端面经项目

环境配置 Vue脚手架的创建 在终端中打开输入 vue create 项目包名 -m npm注意⚠️&#xff1a;项目名称不再允许包含大写字母。 选择第三项 3.选择要安装的模块 从上到下的功能模块&#xff1a; Babel - ES&#xff1a;降级处理Router-Vue&#xff1a;路由插件CSS预处理器E…

基于STM32开发的智能家居照明控制系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 初始化代码控制代码应用场景 家庭照明自动化节能照明管理常见问题及解决方案 常见问题解决方案结论 1. 引言 智能家居照明控制系统通过整合各种传感器和控制器&#xff0c;能够实现对家居照…

[全文]买椟还珠和坏事变好事?《分析模式》漫谈19

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 “Analysis Patterns”的第一章有这么一句&#xff1a; Modeling in a programming language also presents the danger of tying the models to that language. The model may use f…

pythonUI自动化008::allure测试报告(安装及应用)

allure报告预览 1 下载jdk&#xff0c;配置jdk Path变量&#xff1a; https://www.cnblogs.com/FBGG/p/15103119.html&#xff08;这里不作阐述&#xff0c;请看该偏文章配置即可&#xff09; 2 下载allure驱动&#xff0c;配置allure Path变量&#xff1a; 下载allure驱动&a…

Springboot 开发之 Quartz 任务调度框架简介

引言 Quartz Scheduler是一个功能丰富的开源作业调度库&#xff0c;它允许开发人员以灵活的方式创建和管理定时任务。以下是对Quartz Scheduler的详细解析&#xff1a; 官网地址&#xff1a;https://www.quartz-scheduler.org/w3cschool 官方文档&#xff1a;https://www.w3c…

离子交换技术:助力电池材料纯度提升的环保解决方案

在新能源技术迅猛发展的今天&#xff0c;电池正极材料的生产和性能成为了科研与工业界的关注焦点。特别是锂离子电池&#xff0c;其广泛运用于电动汽车和各类便携式电子设备中&#xff0c;对电池性能的要求日益严苛。电池正极材料中的球形氢氧化镍直接影响着电池的充放电效率、…

PhotoShop - 初级抠图

1. 调整边缘 1.1 快速选择工具 使用快速选择工具&#xff0c;photoshop会智能的去识别图像中的边缘部分并以此选区 1.2 参数调整 使用快速选择工具选区之后&#xff0c;实际上很多边缘部分是识别不明确的&#xff0c;所以我们需要进一步调节参数使得选区中的边缘识别更加明…

区分恶意加密货币地址:基于西里尔字母伪装的安全隐患分析

引言 在当前的网络环境中&#xff0c;安全威胁变得越来越复杂&#xff0c;特别是在涉及加密货币交易时&#xff0c;攻击者常常利用各种手段来欺骗用户。最近&#xff0c;研究人员发现了一种利用西里尔字母&#xff08;Cyrillic alphabet&#xff09;伪装的恶意手法&#xff0c…

前端学习笔记-JS篇-03

循环for语句 for 是JavaScript提供的另一种循环控制的话句&#xff0c;它和 while只是语法上存在差异。 for循环基本使用 作用:重复执行代码 好处:把声明起始值、循环条件、变化值写到一起&#xff0c;让人一目了然&#xff0c;它是最常使用的循环形式 for(变量起始值;终止…

猫头虎 分享已解决Bug || TypeError: Cannot read property ‘map‘ of undefined 解决方案

&#x1f42f; 猫头虎 分享已解决Bug || TypeError: Cannot read property map of undefined 解决方案 摘要&#xff1a; 今天猫头虎带大家深入探讨在前端开发中常见的一个令人头疼的问题&#xff1a;TypeError: Cannot read property map of undefined。这个错误通常出现在我…

【Python机器学习】树回归——树回归与标准回归的比较

模型树、回归树和一般的回归方法&#xff0c;为了测试哪个模型最好&#xff0c;可以设计一些函数&#xff0c;它们可以在树构建好的情况下对给定的输入进行预测&#xff0c;之后利用那个这些函数来计算三种回归模型的测试误差。这些模型将在某个数据上进行测试&#xff0c;该数…