【计算机网络】 基于UDP的简单通讯(客户端)

news2024/12/28 5:17:02

文章目录

      • 客户端
        • 流程
        • 代码实现
          • 添加头文件以及库依赖
          • 加载库
          • 创建套接字
          • 发送接收数据
          • 关闭套接字、卸载库
      • 测试

客户端

在这里插入图片描述

流程

客户端跟服务端差不多,也要先加载库,在加载库之后也要创建套接字,但是客户端一定是没有绑定ip地址的,之后是循环发送数据和接收数据,最后关闭套接字、卸载库。

不需要绑定ip地址是因为绑定ip地址是在操作系统那里注册,那么为什么客户端不需要绑定而服务端就要绑定呢,原因是有发送数据的顺序决定的,一般都是客户端先发,主动发消息的时候操作系统就会自动给分配一个端口号,然后操作系统也会帮助选择一个网卡

代码实现
添加头文件以及库依赖
#include<iostream>
#include<WinSock2.h>

#pragma comment(lib,"Ws2_32.lib")

using namespace std;
加载库
	int err = 0;
	WORD version = MAKEWORD(2, 2);
	WSADATA wsaData;
	err = WSAStartup(version,&wsaData);
	if (0 != err) {
		cout << "WSAStartup error" << endl;
		return 1;
	}
	if (2 != HIBYTE(wsaData.wVersion) || 2 != LOBYTE(wsaData.wVersion)) {
		cout << "WSAStartuo version error" << endl;
		WSACleanup();
		return 1;
	}
	else {
		cout << "WSAStart success" << endl;
	}
创建套接字
	//创建套接字
	SOCKET sock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
	if (INVALID_SOCKET == sock) {
		cout << "socket error" << endl;
		WSACleanup();
		return 1;
	}
	else {
		cout << "socket success" << endl;
	}
发送接收数据

因为我们要发给服务端,并且服务端在自己的设备上,所以我们需要创建一个sockaddr_in结构体,然后写入IP地址类型、端口号与ip地址

IP地址类型就是ipv4类型AF_INET,端口号需要填写在服务端绑定的端口号,因为服务端只能接收来自那个端口号的数据包,ip地址就填本机ip地址就可以,注意要用inet_addr()将字符串类型转为ulong类型

因为我们已知对端的ip,所以在接收数据的时候不需要使用输出参数,填NULL即可

	while (true) {
		//发送数据
		char msg[] = "xixix";
		nSendNum = sendto(sock,msg,sizeof(msg),0, (sockaddr*)&addrServer,addrServerSize);
		if (SOCKET_ERROR == nSendNum) {
			cout << "sendto error:" << WSAGetLastError() << endl;
			break;
		}
		//接收数据
		nRecvNum = recvfrom(sock, recvBuf, sizeof(recvBuf), 0, NULL, NULL);
		if (nRecvNum > 0) {
			cout << "say:" << recvBuf << endl;
		}
		else {
			cout << "recvfrom error:" << WSAGetLastError() << endl;
			break;
		}
	}
关闭套接字、卸载库
	closesocket(sock);
	WSACleanup();

最后不要忘记在项目属性中关闭SDL检查

测试

运行一下,先开启服务端再开启客户端

在这里插入图片描述

没有问题!

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

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

相关文章

【Java 基础篇】Java 注解详解

在 Java 编程中&#xff0c;注解&#xff08;Annotation&#xff09;是一种元数据&#xff0c;它提供了关于程序代码的额外信息。注解不直接影响程序的执行&#xff0c;但可以在运行时提供有关程序的信息&#xff0c;或者让编译器执行额外的检查。 本文将详细介绍 Java 注解的…

Mac电脑剪切键Command-X键失灵

在Mac上&#xff0c;Command-X键的剪切功能失效可能是由于键盘快捷键设置出现错误或者剪切的目标文件处于只读状态。 可以尝试以下方法进行解决&#xff1a; 1.检查键盘快捷键设置&#xff1a;转到Apple菜单 > 系统偏好设置 > 辅助功能 > 键盘 > 快捷键&#xff0c…

Pytorch梯度累积实现

前言 主要用于解决显卡内存不足的问题。 梯度累积可以使用单卡实现增大batchsize的效果 梯度累积原理 按顺序执行Mini-Batch&#xff0c;同时对梯度进行累积&#xff0c;累积的结果在最后一个Mini-Batch计算后求平均更新模型变量。 a c c u m u l a t e d ∑ i 0 N g r a…

nat综合实验

路漫漫其修远兮,吾将上下而求索。 实验目的如图 实验思路&#xff1a;配置内网&#xff0c;再配置外网&#xff0c;再做nat clien1配置 clien2配置 pc3配置 lsw1配置 sysname lsw1 # vlan batch 10 20 30 # interface MEth0/0/1 # interface Eth-Trunk1port link-type trunkp…

【Linux】IO操作

IO 典型 IO 模型阻塞 IO非阻塞 IO信号驱动 IO异步 IO常见问题 多路转接模型select 模型poll 模型epoll 模型 典型 IO 模型 IO 操作指的就是数据的输入输出操作&#xff1b;IO 过程可以分为两个步骤&#xff1a;等待 IO 就绪、数据拷贝 阻塞 IO 发起 IO 操作&#xff0c;若当…

【面试高高手】 —— Java基础(36题)

文章目录 1. 八大基本数据类型分类2. 重写和重载的区别3. int和integer区别4. Java的关键字5. 什么是自动装箱和拆箱&#xff1f;6. 什么是Java的多态性&#xff1f;7. 接口和抽象类的区别&#xff1f;8. Java中如何处理异常&#xff1f;9. Java中的final关键字有什么作用&…

iview 的table表格组件使单元格可编辑和输入

表格的列定义中&#xff0c;在需要编辑的字段下使用render函数 template表格组件 <Table border :data"data" :columns"tableColumns" :loading"loading"></Table>data中定义table对象 table: {tableColumns: [{title: 商品序号,k…

服务断路器_Resilience4j的断路器

断路器&#xff08;CircuitBreaker&#xff09;相对于前面几个熔断机制更复杂&#xff0c;CircuitBreaker通常存在三种状态&#xff08;CLOSE、OPEN、HALF_OPEN&#xff09;&#xff0c;并通过一个时间或数量窗口来记录当前的请求成功率或慢速率&#xff0c;从而根据这些指标来…

【JVM】第三篇 JVM对象创建与内存分配机制深度剖析

目录 一. JVM对象创建过程详解1. 类加载检查2. 分配内存2.1 如何划分内存?2.2 并发问题 3. 初始化4. 设置对象头5. 执行<init>方法 二. 对象头和指针压缩详解三. JVM对象内存分配详解四.逃逸分析 & 栈上分配 & 标量替换详解1. 逃逸分析 & 栈上分配2. 标量替…

用纹理图集优化3D场景性能【Texture Atlas】

推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 在 Unity 中开发移动应用程序时&#xff0c;确保一切都得到优化始终至关重要。 最大化帧速率使我们能够专注于优化脚本、烘焙灯光、修改对象等。 当我们将移动应用程序带入虚拟现实时&#xff0c;这一点变得更加重要。 虽…

嵌入式Linux应用开发-文件 IO

嵌入式Linux应用开发-文件 IO 第四章 文件 IO4.1 文件从哪来&#xff1f;4.2 怎么访问文件&#xff1f;4.2.1 通用的 IO 模型&#xff1a;open/read/write/lseek/close4.2.2 不是通用的函数&#xff1a;ioctl/mmap 4.3 怎么知道这些函数的用法&#xff1f;4.4 系统调用函数怎么…

基于微信小程序的健身小助手打卡预约教学系统(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;用户的功能设计为&#xff1a;管理员的功能设计为&#xff1a;健身房的功能设计为&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获…

QFrame类学习笔记

1、QFrame的作用 QFrame类继承于QWidget类&#xff0c;被QAbstractScrollArea, QLabel, QLCDNumber, QSplitter, QStackedWidget, and QToolBox等类继承。 QFrame作为许多基础控件的基类&#xff0c;提供许多成员方法给子类&#xff0c;实现子类的框架样式的设计。框架样式主要…

Android 13 定制化开发--开启相机或麦克风时,去掉状态栏上的绿色图标

Android 12 或更高版本的设备上&#xff0c;当应用使用麦克风或相机时&#xff0c;图标会出现在状态栏中。如果应用处于沉浸模式&#xff0c;图标会出现在屏幕的右上角。用户可以打开“快捷设置”&#xff0c;并选择图标以查看哪些应用当前正在使用麦克风或摄像头。图 1 显示了…

Ubuntu 安装Kafka

在本指南中&#xff0c;我们将逐步演示如何在 Ubuntu 22.04 上安装 Apache Kafka。 在大数据中&#xff0c;数以百万计的数据源生成了大量的数据记录流&#xff0c;这些数据源包括社交媒体平台、企业系统、移动应用程序和物联网设备等。如此庞大的数据带来的主要挑战有两个方面…

【数据结构】插入排序:直接插入排序、折半插入排序、希尔排序的学习知识总结

目录 1、排序的基本概念 2、直接插入排序 2.1 算法思想 2.2 代码实现 3、折半插入排序 3.1 算法思想 3.2 代码实现 4、希尔排序 4.1 算法思想 4..2 代码实现 1、排序的基本概念 排序是将一组数据按照预定的顺序排列的过程&#xff0c;排序的基本概念包括以下内容…

自学WEB后端01-安装Express+Node.js框架完成Hello World!

一、前言&#xff0c;网站开发扫盲知识 1.网站搭建开发包括什么&#xff1f; 前端 前端开发主要涉及用户界面&#xff08;UI&#xff09;和用户体验&#xff08;UX&#xff09;&#xff0c;负责实现网站的外观和交互逻辑。前端开发使用HTML、CSS和JavaScript等技术来构建网页…

数据结构--快速排序

文章目录 快速排序的概念Hoare版本挖坑法前后指针法快速排序的优化三数取中法小区间用插入排序 非递归的快速排序 快速排序的概念 快速排序是通过二叉树的思想&#xff0c;先设定一个值&#xff0c;通过比较&#xff0c;比它大的放在它的右边&#xff0c;比它小的放在它的左边…

Python中的数据常见问题

数据可视化在Python中是一个非常重要的主题&#xff0c;它可以帮助我们更好地理解和分析数据。无论是探索数据的特征&#xff0c;还是向其他人展示数据的结果&#xff0c;数据可视化都起到了关键作用。然而&#xff0c;在进行数据可视化时可能会遇到一些常见问题。本文将为您分…