UDP服务端、TCP的c/s模式

news2024/12/29 11:46:04

一、UDP服务端

socket                                           bind //绑定                                   recvfrom 

ssize_t recvfrom(int sockfd,    socket的fd
                            void *buf,    保存数据的一块空间的地址 
                           size_t len,    这块空间的大小 
                             int flags,     0  默认的接收方式 --- 阻塞方式 
  struct sockaddr *src_addr,   用来保存发送方的地址信息 
            socklen_t *addrlen );    表示发送方实际的地址信息大小

返回值:成功 返回接收到的字节数 ,失败  -1 

int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);
功能:如果该函数在服务器端调用,则表示将参数1相关的文件描述符文件与参数2 指定的接口地址关联,用于从该接口接受数据。

如果该函数在客户端调用,则表示要将数据从参数1所在的描述符中取出并从参数2所在的接口设备上发送出去。

 sockfd 之前通过socket函数创建的文件描述符,套接字id

my_addr 是物理接口的结构体指针。表示该接口的信息

注意:如果是客户端,则该函数可以省略,由默认接口发送数据。

int main(int argc, const char *argv[])
{
    int fd = socket(AF_INET,SOCK_DGRAM,0);
    if (fd < 0)
    {
        perror("socket fail");
        return -1;
    }
    printf("fd = %d\n",fd);
    
    struct sockaddr_in seraddr;
    seraddr.sin_family = AF_INET;
    seraddr.sin_port = htons(50000);
    seraddr.sin_addr.s_addr = inet_addr("192.168.147.1");

    if(bind(fd, (struct sockaddr *)&seraddr,sizeof(seraddr)) < 0)
    {
        perror("bind fail");
        return -1;
    }

    struct sockaddr_in srcaddr;
    socklen_t addrlen = sizeof(srcaddr);
    char buf[1024];
    while(1)
    {
        recvfrom(fd,buf,sizeof(buf),0,(struct sockaddr*)&srcaddr, &addrlen);
        printf("---------------------------\n");
        printf("IP   = %s\n", inet_ntoa(srcaddr.sin_addr));
        printf("post = %d\n", ntohs(srcaddr.sin_port));
        printf("buf = %s\n", buf);
        printf("---------------------------\n");
    }
    return 0;

实现一个UDP的回发:

二、TCPc/s模型

1.TCP客户端

建立连接 :  1.socket               2. bind //可选              3.connect       ....
通信过程 :1.read                    2.write                          3.close 

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

功能:该函数固定有客户端使用,表示从当前主机向目标机发起链接请求。

参数:sockfd 本地socket创建的套接子id
            addr 远程目标主机的地址信息。
             addrlen: 参数2的长度。

返回值:成功 0,失败 -1;

    int fd = socket(AF_INET,SOCK_STREAM,0);
    if(fd < 0)
    {
        perror("socket fail");
        return -1;
    }
    struct sockaddr_in seraddr;
    seraddr.sin_family = AF_INET;
    seraddr.sin_port = htons(50000);
    seraddr.sin_addr.s_addr = inet_addr("192.168.159.130");
    if(connect(fd,(const struct sockaddr *)&seraddr
               ,sizeof(seraddr)) < 0)
    {
        perror("connect fail");
    }

2.TCP服务器

建立连接: 1.socket                                2.bind                                       3.listen客户端的连接请求

                   4.accept  ---这一步完成之后 连接就建立好了,之后就可以收发数据            ..... 

通信过程:1.read                                 2.write                       3.close 

 int listen(int sockfd, int backlog);

函数功能:将套接字文件描述符从主动转为被动文件描述符,然后用于被动监听客户端的连接

函数返回值:成功返回0,失败返回-1, errno被设置

参数:sockfd 表示socket创建的套接字文件描述符

     backlog 指定队列的容量

    int listen_fd = socket(AF_INET,SOCK_STREAM,0);
    if(listen_fd < 0)
    {
        handle_error("socket fail");
    }
    struct sockaddr_in seraddr;
    seraddr.sin_family = AF_INET;
    seraddr.sin_port = htons(50000);
    seraddr.sin_addr.s_addr = inet_addr("192.168.159.130");
    if(bind(listen_fd,(const struct sockaddr *)&seraddr
            ,sizeof(seraddr)) < 0)
    {
        handle_error("bind fail");
    }
        if(listen(listen_fd, 5) < 0)
        {
            handle_error("listen fail");
        }
        int connfd = accept(listen_fd, NULL, NULL);
        if(connfd < 0)
        {
            handle_error("accept fail");
        }
        printf("connfd = %d\n", connfd);


tcp如何建立连接--------tcp三次握手  

断开连接 tcp --------四次回收 

实现一个tcp的回发:

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

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

相关文章

网络编程TCP与UDP

TCP与UDP UDP头&#xff1a; 包括源端口、目的地端口、用户数据包长度&#xff0c;检验和 数据。 typedef struct _UDP_HEADER {unsigned short m_usSourPort;    // 源端口号16bitunsigned short m_usDestPort;    // 目的端口号16bitunsigned short m_usLen…

一款B to B Connector的仿真结果与开发样品实测的结果对比

下面是一款B to B 连接器开发初期的CST仿真结果: 回波损耗 插入损耗 时域阻抗 开发样品出来后第三方测试机构的实测结果

Auto CAD 常用指令汇总 [持续更新]

简介 AutoCAD是由美国Autodesk公司开发的一款自动计算机辅助设计软件&#xff0c;广泛应用于建筑、工程、城市规划等多个领域。自1982年发布以来&#xff0c;AutoCAD不断进化&#xff0c;成为行业标准之一。它支持二维绘图和三维建模功能&#xff0c;用户可以精确绘制各种图形&…

BSCI(Business Social Compliance Initiative)验厂

在当今全球化的经济环境中&#xff0c;企业社会责任&#xff08;Corporate Social Responsibility, CSR&#xff09;已成为衡量企业成功与否的重要标尺之一。而BSCI&#xff08;Business Social Compliance Initiative&#xff09;验厂&#xff0c;作为国际间广泛认可的社会责任…

服务器Ubuntu22.04系统 使用dcocker部署安装ollama和搭配open_webui使用

服务器Ubuntu22.04系统 使用dcocker部署安装ollama和搭配open_webui使用 一、ubuntu和docker基本环境配置 1.更新包列表&#xff1a; 打开终端&#xff0c;输入以下命令&#xff1a; sudo apt-get updatesudo apt upgrade更新时间较长&#xff0c;请耐心等待 2. 安装docke…

[MOCO] Momentum Contrast for Unsupervised Visual Representation Learning

1、目的 无监督表示学习在自然图像领域已经很成功&#xff0c;因为语言任务有离散的信号空间&#xff08;words, sub-word units等&#xff09;&#xff0c;便于构建tokenized字典 现有的无监督视觉表示学习方法可以看作是构建动态字典&#xff0c;字典的“keys”则是从数据&am…

测评了几百款素材管理软件,新手设计师如何进行高效的素材管理?附教程

设计师朋友们&#xff0c;大家在日常工作中肯定积累了各种各样的素材&#xff0c;大家都保存在哪里呢&#xff1f;是散落在电脑磁盘里&#xff0c;还是用一个专门的素材管家管理呢&#xff1f;作为新手设计师&#xff0c;目前是在使用一款经典好用的素材管理软件—Eagle&#x…

Java学习_17_集合综合练习(待更新)

文章目录 前言一、自动点名器二、斗地主小游戏1、准备牌2、洗牌3、发牌4、理牌 总结 前言 博客仅记录个人学习进度和一些查缺补漏。 学习内容&#xff1a;BV17F411T7Ao 部分内容因没有学到&#xff0c;等待后续更新 一、自动点名器 /**** 点名器1&#xff0c;N个学生随机点名…

Edge-TTS:微软推出的,免费、开源、支持多种中文语音语色的AI工具[工具版]

Edge-TTS&#xff0c;由微软推出的这款免费、开源的AI工具&#xff0c;为用户带来了丰富多样的中文语音体验。它不仅支持多种中文语音语色&#xff0c;还能实现流畅自然的语音合成。Edge-TTS凭借其高度可定制化的特点&#xff0c;广泛应用于智能助手、语音播报、教育培训等领域…

商业软件许可证介绍|简单原理探究

个人博客&#xff1a;无奈何杨&#xff08;wnhyang&#xff09; 个人语雀&#xff1a;wnhyang 共享语雀&#xff1a;在线知识共享 Github&#xff1a;wnhyang - Overview 引入话题 既然是商业软件&#xff0c;涉及到商业&#xff0c;那目的就是赚钱。 就拿IDEA举例&#x…

Linux系统中的常见操作命令

目录 命令总结&#xff1a; 一、目录处理命令 二、文件处理命令 三、权限管理命令 四、其它实用命令 命令总结&#xff1a; &#xff08;目录&#xff09; ls [参数] 目录、&#xff08;查看目录&#xff09;pwd、&#xff08;切换目录&#xff09;cd [目录路径]、&…

4.1栈和队列基本概念+经典OJ题

本篇博客来梳理栈和队列基本概念以及一道经典OJ题&#xff0c;题目已插入超链接&#xff0c;点击即可跳转~ 一、栈的相关概念 1&#xff0e;栈 一种特殊的线性表&#xff0c;只允许在固定的一端插入和删除元素&#xff0c;栈中的数据遵循后进先出原则 &#xff08;1&#x…

Pytorch添加自定义算子之(12)-开闭原则设计tensorrt和onnxruntime推理语义分割模型

一、开闭原则 开闭原则是SOLID原则中的一个,指的是尽量使用开放扩展,关闭修改的设计原则。 在C++中如何使用开闭原则导出动态库,可以按照以下步骤进行: 定义抽象基类:定义动态库中的抽象基类,该基类应该封装可扩展的接口。 实现派生类:实现基类的派生类,这些派生类将封…

Vue 导航条+滑块效果

目录 前言代码效果展示导航实现代码导航实现代码导航应用代码前言 总结一个最近开发的需求。设计稿里面有一个置顶的导航条,要求在激活的项目下面展示个下划线。我最先开始尝试的是使用 after 的伪类选择器,直接效果一样,但是展示的时候就会闪现变化,感觉不够自然,参考了一…

继承(下)【C++】

文章目录 子类继承父类之后&#xff0c;子类的默认成员函数的变化构造函数编译器自动生成的构造函数程序员手动写的构造函数 拷贝构造编译器自动生成的拷贝构造函数程序员手动写的拷贝构造函数 赋值重载编译器自动生成的赋值重载程序员手动写的赋值重载 析构函数 继承与友元菱形…

vm安装mac虚拟机

vm安装mac虚拟机 简介实操 简介 教程&#xff1a;完全面向萌新的黑苹果安装教学&#xff1a;黑苹果安装从入门到入白&#xff0c;借助VMware虚拟机给实体机硬盘按照macOS黑苹果系统 实操 下载unlocker&#xff0c;之后运行vm就可以新建mac虚拟机了 新建一个没有选择镜像的…

【Electron】桌面应用开发快速入门到打包Windows应用程序

electron 实现桌面应用开发快速入门到打包Windows应用程序 一、基本介绍 ‌‌Electron 是一个使用‌ JavaScript、‌HTML 和‌ CSS 构建桌面应用程序的框架。它通过将‌Chromium和‌Node.js嵌入到其二进制文件中&#xff0c;允许开发者使用JavaScript代码库创建跨平台的桌面应…

汽车冷却液温度传感器

1、冷却液温度传感器的功能 发动机冷却液温度传感器&#xff0c;也称为ECT&#xff0c;是帮助保护发动机&#xff0c;提高发动机工作效率以及帮助发动机稳定运行的非常重要的传感器之一。 发动机冷却液温度 &#xff08;ECT&#xff09; 传感器用于测量发动机的冷却液温度&…

IO进程线程 0822作业

作业 使用write和read完成文件的拷贝。 将1.txt文件内容拷贝到2.txt中 #include <myhead.h> int main(int argc, const char *argv[]) {if(argc ! 3){printf("外部传参错误\n");return -1;}int fd1;fd1 open(argv[1],O_RDONLY);if(fd1 -1){perror("op…

Java基础——自学习使用(static关键字)

一、static关键字是什么&#xff1f; static修饰的代码属于类&#xff0c;定义的变量存储在方法区的静态常量池当中 二、static可以修饰什么 1.static修饰变量 static修饰的变量叫做类变量&#xff0c;被所有该类产生的对象所共享&#xff0c;存储在方法区的静态常量池中 2…