实验12 socket网络编程

设计程序
1.阅读TCP、UDP数据通信的例子8-2、8-7,理解并运行查看其功能。
2. 编写程序,使用socket网络接口函数,实现同一网段的两台主机的聊天。注:使用多线程,实现实时聊天功能。(使用UDP或TCP方式)

Server.cpp

#include <cstring>
#include <locale>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define BUFSIZE 4096
#define SERV_PORT 9528
#include <iostream>

using namespace std;

void sys_err(const char* str){
    perror(str);
    exit(1);
}

int main(){
    // listen fd
    int lfd = 0;
    // client fd
    int cfd = 0;
    char buf[BUFSIZE];

    // 创建服务端负责监听的socket
    lfd = socket(AF_INET, SOCK_STREAM, 0);

    // 设置服务端socket 地址结构
    struct sockaddr_in serv_addr;
    serv_addr.sin_family = AF_INET;
    // htons host to network short 主机字节序转网络字节序短整形 16位端口号
    serv_addr.sin_port = htons(SERV_PORT);
    // htonl host to network long 主机字节序转网络字节序长整形 32位IP地址
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);

    // 监听socket绑定地址结构
    if (bind(lfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1)
        sys_err("bind");

    // 设置监听上限
    listen(lfd, 128);

    // 阻塞监听
    struct sockaddr_in cli_addr; // 监听到的连接的地址结构的传出参数
    socklen_t cli_addr_len;
    cfd = accept(lfd, (struct sockaddr*)&cli_addr, &cli_addr_len);
    if (cfd == -1)
        sys_err("accept");
    // 打印连接信息
    char client_IP[40]; // IP字符串
    cout << "client connected..." << endl;
    printf("client ip : %s\n",inet_ntop(AF_INET, &cli_addr.sin_addr.s_addr, client_IP, sizeof(client_IP)));
    cout << "client port : " << ntohs(cli_addr.sin_port) << endl;


    // 处理
    while (1){
        // 读取客户端内容
        int len = read(cfd, buf, sizeof buf);

        if (len == 0){
            cout << "client disconnected..." << endl;
            break;
        }

        // 回显接受的客户端内容
        cout << "received client msg : " << buf << endl;

        for (int i = 0; i < len; i++)
            buf[i] = toupper(buf[i]);

        // 回复客户端
        write(cfd, buf, len);
    }

    close(lfd);
    close(cfd);

    return 0;
}

可以使用shell命令测试服务端代码

nc 127.0.0.1 9528

在这里插入图片描述

Client.cpp

#include <cstdlib>
#include <cstring>
#include <stdio.h>
#include <unistd.h>
#include <error.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <iostream>
#define BUFSIZE 4096
#define SERV_PORT 9528

using namespace std;

void sys_err(const char *str){
  perror(str);
  exit(1);
}

int main(){
  const char *serv_ip = "127.0.0.1"; // 要连接的服务器IP

  // 设置要连接的服务器的地址结构
  struct sockaddr_in serv_addr;
  serv_addr.sin_family = AF_INET;
  inet_pton(AF_INET, serv_ip, &serv_addr.sin_addr.s_addr);
  serv_addr.sin_port = htons(SERV_PORT);

  int cfd = socket(AF_INET, SOCK_STREAM, 0);
  if(cfd == -1)
    sys_err("socket");

  if(connect(cfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1){
    sys_err("connect");
  }

  char buf[BUFSIZE];
  while(1){
    cout << "Please input your sent to server msg : ";
    cin >> buf;
    write(cfd, buf, strlen(buf));
    read(cfd, buf, sizeof(buf));
    cout << "received server msg : "  << buf << endl;

  }

}

编译运行

g++ -o server server.cpp
g++ -o client client.cpp

在这里插入图片描述

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

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

相关文章

leetcode二叉搜索树部分笔记

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 二叉搜索树 1. 二叉搜索树的最小绝对差2. 二叉搜索树中第 K 小的元素3. 验证二叉搜索树 1. 二叉搜索树的最小绝对差 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中…

论文学习—VAE

VAE----Auto-Encoding Variational Bayes 2024年12月17日-2024年12月18日摘要引言方法例子&#xff1a;变分自动编码器 2024年12月17日-2024年12月18日 从今天开始&#xff0c;我准备记录自己学习的内容以此来检验我每天的学习量&#xff0c;菜鸡一枚&#xff0c;希望能够与大…

Go语言后台实现选中式导出excel文件

实现选中导出为excel文件的基本实现方案是前端将选中的数据传递给后端&#xff0c;后台接受这些数据生成excel文件的流&#xff0c;将流返回给前端并在响应体设置文件的格式。 这时只要将需要下载的数据提交到改接口就会返回文件流数据&#xff0c;提供下载。具体实现代码如下&…

大模型微调---Prompt-tuning微调

目录 一、前言二、Prompt-tuning实战2.1、下载模型到本地2.2、加载模型与数据集2.3、处理数据2.4、Prompt-tuning微调2.5、训练参数配置2.6、开始训练 三、模型评估四、完整训练代码 一、前言 Prompt-tuning通过修改输入文本的提示&#xff08;Prompt&#xff09;来引导模型生…

spring学习(spring-bean实例化(实现FactoryBean规范)(延迟实例化bean))

目录 一、spring容器实例化bean的几种方式。 &#xff08;1&#xff09;无参构造与有参构造方法。 &#xff08;2&#xff09;静态工厂与实例工厂。 &#xff08;3&#xff09;实现FactoryBean规范。 二、spring容器使用实现FactoryBean规范方式实现bean实例化。 &#xff08;1…

【Java】mac安装Java17(JDK17)

文章目录 下载java17一、安装二、环境变量 下载java17 官网下载&#xff1a;https://www.oracle.com/java/technologies/downloads 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、安装 直接安装后&#xff0c;安装完后目录会存放在下面目录下 /…

mysql免安装版配置教程

一、将压缩包解压至你想要放置的文件夹中&#xff0c;注意&#xff1a;绝对路径中要避免出现中文 二、在解压目录下新建my.ini文件&#xff0c;已经有的就直接覆盖 my.ini文件内容 [mysqld] # 设置3306端口 port3306 # 设置mysql的安装目录 basedirD:\\tools\\mysql-8.1.0-win…

web:pc端企业微信登录-vue版

官方文档&#xff1a;developer.work.weixin.qq.com/document/pa… 不需要调用ww.register&#xff0c;直接调用ww.createWWLoginPanel即可创建企业微信登录面板 - 文档 - 企业微信开发者中心 (qq.com) 引入 //通过 npm 引入 npm install wecom/jssdk import * as ww from we…

基于Spring Boot的无可购物网站系统

一、系统背景与意义 随着互联网的快速发展&#xff0c;电子商务已经成为人们日常生活的重要组成部分。构建一个稳定、高效、可扩展的电商平台后端系统&#xff0c;对于满足用户需求、提升用户体验、推动业务发展具有重要意义。Spring Boot作为当前流行的Java开发框架&#xff…

YOLOv11改进,YOLOv11添加DLKA-Attention可变形大核注意力,WACV2024 ,二次创新C3k2结构

摘要 作者引入了一种称为可变形大核注意力 (D-LKA Attention) 的新方法来增强医学图像分割。这种方法使用大型卷积内核有效地捕获体积上下文,避免了过多的计算需求。D-LKA Attention 还受益于可变形卷积,以适应不同的数据模式。 理论介绍 大核卷积(Large Kernel Convolu…

fpga系列 HDL:Quartus II PLL (Phase-Locked Loop) IP核 (Quartus II 18.0)

在 Quartus II 中使用 PLL (Phase-Locked Loop) 模块来将输入时钟分频或倍频&#xff0c;并生成多个相位偏移或频率不同的时钟信号&#xff1a; 1. 生成 PLL 模块 在 Quartus II 中&#xff1a; 打开 IP Components。 file:///C:/intelFPGA_lite/18.0/quartus/common/help/w…

JAVA:代理模式(Proxy Pattern)的技术指南

1、简述 代理模式(Proxy Pattern)是一种结构型设计模式,用于为其他对象提供一种代理,以控制对这个对象的访问。通过代理模式,我们可以在不修改目标对象代码的情况下扩展功能,满足特定的需求。 设计模式样例:https://gitee.com/lhdxhl/design-pattern-example.git 2、什…

3D Gaussian Splatting for Real-Time Radiance Field Rendering-简洁版

1. 研究背景与问题 传统的3D场景表示方法&#xff0c;如网格和点云&#xff0c;适合GPU加速的光栅化操作&#xff0c;但缺乏灵活性。而基于神经辐射场&#xff08;NeRF&#xff09;的表示方式&#xff0c;尽管质量高&#xff0c;但需要高成本的训练和渲染时间。此外&#xff0…

Unity性能优化---使用SpriteAtlas创建图集进行批次优化

在日常游戏开发中&#xff0c;UI是不可缺少的模块&#xff0c;而在UI中又使用着大量的图片&#xff0c;特别是2D游戏还有很多精灵图片存在&#xff0c;如果不加以处理&#xff0c;会导致很高的Batches&#xff0c;影响性能。 比如如下的例子&#xff1a; Batches是9&#xff0…

计算机网络知识点全梳理(三.TCP知识点总结)

目录 TCP基本概念 为什么需要TCP 什么是TCP 什么是TCP链接 如何唯一确定一个 TCP 连接 TCP三次握手 握手流程 为什么是三次握手&#xff0c;而不是两次、四次 为什么客户端和服务端的初始序列号 ISN 不同 既然 IP 层会分片&#xff0c;为什么 TCP 层还需要 MSS TCP四…

找出1000以内的所有回文数

找出1000以内的所有回文数 方法概述检查回文数的方法伪代码C代码实现代码解析运行结果在计算机科学中,回文数是一种具有对称性质的数,即从左向右读和从右向左读都是相同的。例如,121、1331、12321都是回文数。本文将利用数据结构、C语言和算法的知识来编写一个程序,找出100…

Go-FastDFS文件服务器一镜到底使用Docker安装

本文章介绍一镜到底安装go-fastdfs并配置数据文件到linux 由于国内镜像无法安装go-fastdfs&#xff1a;国内环境已经把docker官方的网站给封闭了 我们需要从国外的一台服务器&#xff0c;下载images镜像&#xff0c;然后进行转发加载到国内服务器 当然我也给你们准备了docke…

ArcGIS计算土地转移矩阵

在计算土地转移矩阵时&#xff0c;最常使用的方法就是在ArcGIS中将土地利用栅格数据转为矢量&#xff0c;然后采用叠加分析计算&#xff0c;但这种方法计算效率低。还有一种方法是采用ArcGIS中的栅格计算器&#xff0c;将一个年份的地类编号乘以个100或是1000再加上另一个年份的…

软路由系统 --- VMware安装与配置OpenWRT

目录: OpenWrt安装与配置 一、下载OpenWRT映像二、img转换vmdk格式三、创建虚拟机&#xff08;OpenWRT&#xff09;四、启动系统&#xff08;OpenWRT&#xff09;五、配置网络信息&#xff08;LAN、WAN&#xff09;六、登录OpenWRT后台管理界面 一、下载OpenWRT映像 OpenWrt映…

利用notepad++删除特定关键字所在的行

1、按组合键Ctrl H&#xff0c;查找模式选择 ‘正则表达式’&#xff0c;不选 ‘.匹配新行’ 2、查找目标输入 &#xff1a; ^.*关键字.*\r\n (不保留空行) ^.*关键字.*$ (保留空行)3、替换为&#xff1a;&#xff08;空&#xff09; 配置界面参考下图&#xff1a; ​​…