2024.3.4 作业

1、流式域套接字

1>tcp服务端实现

#include<myhead.h>
int main(int argc, const char *argv[])
{
	//1、创建套接字
	int sfd = socket(AF_UNIX, SOCK_STREAM, 0);
	if(sfd == -1)
	{
		perror("socket error");
		return -1;
	}

	//2、判断套接字文件是否存在,如果存在则需要删除
	if(access("./mysocket", F_OK) == 0)
	{
		//说明存在,将该文件删除
		if(unlink("./mysocket") == -1)
		{
			perror("unlink error");
			return -1;
		}
	}

	//绑定套接字文件
	//2.1 填充地址信息结构体
	struct sockaddr_un sun;
	sun.sun_family = AF_UNIX;
	strcpy(sun.sun_path, "./mysocket");

	//2.2 绑定 
	if(bind(sfd, (struct sockaddr*)&sun, sizeof(sun)) == -1)
	{
		perror("bind error");
		return -1;
	}
	printf("bind success\n");

	//3、监听
	if(listen(sfd,128) == -1)
	{
		perror("listen 128");
		return -1;
	}
	printf("listen success\n");

	//4、阻塞等待客户端连接需求
	//定义容器接受客户端地址信息
	struct sockaddr_un cun;
	socklen_t socklen = sizeof(cun);

	int newfd = -1;
	if((newfd = accept(sfd, (struct sockaddr*)&cun, &socklen)) == -1)
	{
		perror("accept error");
		return -1;
	}
	printf("有新客户发来连接请求\n");

	//5、数据收发
	char rbuf[128]= "";
	while(1)
	{
		//清空
		bzero(rbuf, sizeof(rbuf));
		recv(newfd, rbuf, sizeof(rbuf), 0);
		printf("[%s]:%s\n",cun.sun_path, rbuf);

		//连接一个笑脸回复
		strcat(rbuf, "*_*");

		//发送回去
		send(newfd, rbuf, strlen(rbuf), 0);
		printf("发送成功\n");
	}
	//6、关闭套接字
	close(sfd);
	close(newfd);
	return 0;
}

客户端实现

#include<myhead.h>

int main(int argc, const char *argv[])
{
    //1、创建用于通信的套接字文件描述符
    int cfd = socket(AF_UNIX, SOCK_STREAM, 0);
    if(cfd == -1)
    {
        perror("socket error");
        return -1;
    }
    printf("cfd = %d\n", cfd);          //3

        //判断套接字文件是否存在,如果存在则需要删除
    if(access("./mysocket1", F_OK) == 0)
    {
        //说明存在,将该文件删除
        if(unlink("./mysocket1") == -1)
        {
            perror("unlink error");
            return -1;
        }
    }


    //2、绑定(非必须)
    //2.1 填充地址信息结构体
    struct sockaddr_un cun;
    cun.sun_family = AF_UNIX;
    strcpy(cun.sun_path, "./mysocket1");

    //2.2 绑定
    if(bind(cfd, (struct sockaddr*)&cun, sizeof(cun)) == -1)
    {
        perror("bind error");
        return -1;
    }

    printf("bind success\n");
    
    
    //3、连接服务器
    //3.1填充要连接的服务器地址信息结构体
    struct sockaddr_un sun;
    sun.sun_family = AF_UNIX;   //地址族
    strcpy(sun.sun_path, "./mysocket");      //套接字文件

    //3.2 连接服务器
    if(connect(cfd, (struct sockaddr*)&sun, sizeof(sun))==-1)
    {
        perror("connect error");
        return -1;
    }
    printf("connect success\n");
    

    //4、数据收发
    char wbuf[128] = "";
    while(1)
    {
        //清空数据
        bzero(wbuf, sizeof(wbuf));

        printf("请输入>>>");
        fgets(wbuf, sizeof(wbuf), stdin);   //从终端输入
        wbuf[strlen(wbuf)-1] = 0;

        //将数据发送给服务器
        send(cfd, wbuf, strlen(wbuf), 0);
        printf("发送成功\n");

        //判断发送的数据
        if(strcmp(wbuf, "quit") == 0)
        {
            break;
        }

        //接收服务器发来的消息
        //清空数据
        bzero(wbuf, sizeof(wbuf));
        recv(cfd, wbuf, sizeof(wbuf), 0); 

        printf("收到消息为:%s\n", wbuf);

    }


    //5、关闭套接字
    close(cfd);

    return 0;
}

2>报式域套接字

服务端实现:

#include<myhead.h>

int main(int argc, const char *argv[])
{
    //1、创建用于通信的套接字
    int sfd = socket(AF_UNIX, SOCK_DGRAM, 0);
    if(sfd == -1)
    {
        perror("socket error");
        return -1;
    }
    printf("sfd = %d\n", sfd);           //3

    //判断套接字文件是否存在,如果存在则需要删除
    if(access("./linux1", F_OK) == 0)
    {
        //说明存在,将该文件删除
        if(unlink("./linux1") == -1)
        {
            perror("unlink error");
            return -1;
        }
    }


    //2、绑定IP地址和端口号
    //2.1填充地址信息结构体
    struct sockaddr_un sun;
    sun.sun_family = AF_UNIX;          //地址族
    strcpy(sun.sun_path, "./linux1");

    //2,2绑定
    if(bind(sfd, (struct sockaddr*)&sun, sizeof(sun)) == -1)
    {
        perror("bind error");
        return -1;
    }
    printf("bind success\n");

    //3、收发数据
    char rbuf[128] = "";

    //定义容器接收对端地址信息结构体
    struct sockaddr_un cun;
    socklen_t socklen = sizeof(cun);

    while(1)
    {
        //清空数组
        bzero(rbuf, sizeof(rbuf));

        //接收数据
        recvfrom(sfd, rbuf, sizeof(rbuf), 0, (struct sockaddr*)&cun, &socklen);

        printf("收到消息为:%s\n", rbuf);

        //将消息加个笑脸回过去
        strcat(rbuf, "*_*");
        if(sendto(sfd, rbuf, strlen(rbuf), 0, (struct sockaddr*)&cun, socklen) == -1)
        {
            perror("sendto error");
            return -1;
        }
        
    }

    //4、关闭套接字
    close(sfd);

    return 0;
}

客户端实现:

#include<myhead.h>



int main(int argc, const char *argv[])
{
    //1、创建用于通信的套接字
    int cfd = socket(AF_UNIX, SOCK_DGRAM, 0);
    if(cfd == -1)
    {
        perror("socket error");
        return -1;
    }
    printf("cfd = %d\n", cfd);           //3


    //判断套接字文件是否存在,如果存在则需要删除
    if(access("./linux2", F_OK) == 0)
    {
        //说明存在,将该文件删除
        if(unlink("./linux2") == -1)
        {
            perror("unlink error");
            return -1;
        }
    }

    //2、绑定IP地址和端口号(如果要接收服务器消息必须绑定)
    struct sockaddr_un cun;
    cun.sun_family = AF_UNIX;
    strcpy(cun.sun_path, "./linux2");

    if(bind(cfd, (struct sockaddr*)&cun, sizeof(cun))==-1)
    {
        perror("bind error");
        return -1;
    }


    //3、收发数据
    char wbuf[128] = "";

    //定义容器,记录服务器的地址信息结构体
    struct sockaddr_un sun;
    sun.sun_family = AF_UNIX;
    strcpy(sun.sun_path,"./linux1");

    while(1)
    {
        //清空数组
        bzero(wbuf, sizeof(wbuf));

        //从终端获取数据
        printf("请输入>>>");
        fgets(wbuf, sizeof(wbuf), stdin);
        wbuf[strlen(wbuf)-1] = 0;

        //将数据发送给服务器
        sendto(cfd, wbuf, sizeof(wbuf), 0, (struct sockaddr*)&sun, sizeof(sun));
        
        printf("发送成功\n");

        //接收服务器回复的消息
        bzero(wbuf, sizeof(wbuf));

        recvfrom(cfd, wbuf, sizeof(wbuf), 0, NULL, NULL);
        printf("收到消息为:%s\n", wbuf);
    }

    //4、关闭套接字
    close(cfd);

    return 0;
}


 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

史上最细,企业性能测试步骤详细,测试老鸟带你一篇打通!

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、性能测试流程 …

总线要点笔记

1. AXI/AHB/APB差异 AMBA (Advanced Microcontroller Bus Architecture) 高级处理器总线架构 AHB (Advanced High-performance Bus) 高级高性能总线 ASB (Advanced System Bus) 高级系统总线 APB (Advanced Peripheral Bus) 高级外围总线 AXI (Advanced eXtensible Interface) …

【洛谷 P8682】[蓝桥杯 2019 省 B] 等差数列 题解(数学+排序+差分)

[蓝桥杯 2019 省 B] 等差数列 题目描述 数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列&#xff0c;只记得其中 N N N 个整数。 现在给出这 N N N 个整数&#xff0c;小明想知道包含这 N N N 个整数的最短的等差数列有几项&#xff1f; 输…

探究大语言模型如何使用长上下文

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 论文链接&#xff1a;https://doi.org/10.1162/tacl_a_00638 论文标题&#xff1a;Lost in the Middle: How Language Models Use Long Contexts 论文发表期刊&#xff1a;Transactions of the Assoc…

【Apple Vision Pro应用】Cinephile——Cinema Mode for Local Video(苹果眼睛视频播放器)

Cinephile 为您提供了一个完全无干扰、无限制的无限空间&#xff0c;让您尽享视频的精彩。它创造了一种身临其境的环境&#xff0c;您可以在能够想象到的最大屏幕上&#xff0c;从任何角度或位置观看内容。 您可以根据个人喜好自由调整视频的大小和位置。添加视频中的环境光&am…

MoonBit 新增 += 运算符,引入 super trait 和 List 字面量机制

MoonBit更新 1. 添加了 系列语句 包括、-、*、/&#xff0c;支持运算符重载&#xff1a; fn init {let array [1,2,3,4]array[2] * 10println(array) // [1, 2, 30, 4] }fn init {let mut a 1a 20println(a) // 21 } struct Foo {data : Array[Int] } derive(Debug)fn o…

转载-七种Java常用序列化框架的选型与对比

七种Java常用序列化框架的选型与对比 本文章转自&#xff1a;乐字节 文章主要讲解&#xff1a;Java常用序列化框架 获取更多前端相关资料可以点击链接加入群聊【Java技术交流群】&#xff1a;正在跳转暗号&#xff1a;166 转载地址&#xff1a;七种Java常用序列化框架的选型…

Linux设备模型(九) - bus/device/device_driver/class

一&#xff0c;设备驱动模型 1&#xff0c;概述 在前面写的驱动中&#xff0c;我们发现编写驱动有个固定的模式只有往里面套代码就可以了&#xff0c;它们之间的大致流程可以总结如下&#xff1a; 实现入口函数xxx_init()和卸载函数xxx_exit() 申请设备号 register_chrdev_r…

软件测试的基本流程是什么?软件测试流程详细介绍

软件测试和软件开发一样&#xff0c;是一个比较复杂的工作过程&#xff0c;如果无章法可循&#xff0c;随意进行测试势必会造成测试工作的混乱。为了使测试工作标准化、规范化&#xff0c;并且快速、高效、高质量地完成测试工作&#xff0c;需要制订完整且具体的测试流程。 01…

中国各省绿色金融试点DID数据集(2010-2023)

一、数据简介 最新的2010-2023年中国31省绿色金融试点DID数据&#xff0c;供大家研究使用。 数据说明&#xff1a;内含绿色金融改革创新试验区名单&#xff0c;将试验区获批当年及以后的政策虚拟变量项是否试点赋值为1&#xff0c;获批之前赋值为0。其中赣江新区、贵安新区为国…

Spring:FactoryBean预加载逻辑以及自定义实现Mybatis的接口扫描

Spring&#xff1a;FactoryBean预加载逻辑以及自定义实现Mybatis的接口扫描 1 前言 参考Mybatis框架的Mapper注解扫描Mapper接口的业务逻辑&#xff0c;其中集成Spring的逻辑里使用到了Spring框架的FactoryBean拓展点&#xff0c;本文针对Spring FactoryBean的加载流程进行分…

Unity 摄像机的深度切换与摄像机画面投影

摄像机可选&#xff1a;透视、正交 正交类似投影&#xff0c;1比1 透视类似人眼&#xff0c;近大远小 摄像机投影 在项目中新建&#xff1a;渲染器纹理 将新建纹理拖动到相机的目标纹理中 新建一个平面&#xff0c;将新建材质组件放到平面中即可。 相机深度切换 使用代…

Git实战(2)

git work flow ------------------------------------------------------- ---------------------------------------------------------------- 场景问题及处理 问题1&#xff1a;最近提交了 a,b,c,d记录&#xff0c;想把b记录删掉其他提交记录保留&#xff1a; git reset …

JavaWeb之 Web概述

目录 前言1.1 Web和 JavaWeb的概念1.2 JavaWeb技术栈1.2.1 B/S架构1.2.2 静态资源1.2.3 动态资源1.2.4 数据库1.2.5 HTTP协议1.2.6 Web服务器 1.3 JavaWeb 学习内容 前言 博主将用 CSDN 记录 Java 后端开发学习之路上的经验&#xff0c;并将自己整理的编程经验和知识分享出来&a…

浅谈MySQL的B树索引与索引优化

MySQL的MyISAM、InnoDB引擎默认均使用B树索引&#xff08;查询时都显示为“BTREE”&#xff09;&#xff0c;本文讨论两个问题&#xff1a; 为什么MySQL等主流数据库选择B树的索引结构&#xff1f;如何基于索引结构&#xff0c;理解常见的MySQL索引优化思路&#xff1f; 为什…

S7-1500 PLC装载存储器已使用容量变红的解决方法示例

S7-1500 PLC装载存储器已使用容量变红的解决方法示例 1.如何在线查看S7-1200/1500 PLC的内部存储区的使用情况? 答:在项目树中展开PLC程序打开“在线和诊断”,点击“转至在线”使TIA PORTAL在线连接到S7-1200 CPU,在“存储器”标签查看CPU内存使用情况,如下图所示: 2.如何…

LeetCode234题:回文链表(python3)

代码思路&#xff1a;将链表的值复制到数组列表中&#xff0c;再使用双指针法判断&#xff0c;不断更新current_node的值。 # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next…

探索Linux世界:初次接触和基本指令(文件操作)

文章目录 1.基本介绍和准备2.基本指令和Linux的基本操作3.几个重要基本指令3.1 ls - 列出文件和目录3.1.1文件的知识3.1.2 .和..文件 3.2pwd - 显示当前工作目录3.2.1路径知识 3.3 cd - 切换目录3.4 touch - 创建文件或更新时间戳3.5mkdir - 创建新目录3.6rm - 删除文件或目录3…

基本运算符

参考C Primer Plus进行C语言学习 文章目录 基本运算符 除法运算符&#xff1a;/其他运算 1、除法运算符 在C语言中&#xff0c;整数除法结果的小数部分被丢弃&#xff0c;这一过程被称为截断。 2.其他运算符 &#xff08;1&#xff09;sizeof运算符和size_t类型 回顾一下&…

C++ 前缀和

目录 例1 例2 例3 例4 例5 例6 例7 例8 例1 DP34 【模板】前缀和 分析&#xff1a;dp和arr的大小并不是固定的&#xff0c;就是有没有偏移量&#xff0c;这里的n是从1开始&#xff0c;不如直接放到下标1处&#xff0c;在最后的减法时&#xff0c;如果用第一个参考代码会…