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

news/2024/5/18 13:01:21 标签: 计算机网络, udp, 网络协议

文章目录

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

客户端

在这里插入图片描述

流程

客户端跟服务端差不多,也要先加载库,在加载库之后也要创建套接字,但是客户端一定是没有绑定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.niftyadmin.cn/n/5064089.html

相关文章

2023年 2月3月 工作经历

2月 #pragma make_public(type) 托管C导出传统C类&#xff0c;另一个托管C项目使用不了。传统C类make_public后&#xff0c;就可以使用了。对模板类无效&#xff0c;比如&#xff1a;std::string。 C#线程绑定CPU 我的方案&#xff1a; 假定我们想把 CPU0 设置成专有CPU。 定…

【数据结构】红黑树(C++实现)

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;数据结构 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;【数据…

【初识Linux】上

初识Linux上 一、Linux背景1.1 UNIX发展的历史1.2 UNIX发展的历史 二、开源三、官网Linux官网 四、企业应用现状五、发行版本六、 os概念&#xff0c;定位 本博客简介 初始Linux操作系统初识shell命令 ,了解若干背景知识。使用常用Linux命令了解Linux权限概念与思想,能深度理解…

深度学习 图像分割 PSPNet 论文复现(训练 测试 可视化)

Table of Contents 一、PSPNet 介绍1、原理阐述2、论文解释3、网络模型 二、部署实现1、PASCAL VOC 20122、模型训练3、度量指标4、结果分析5、图像测试 一、PSPNet 介绍 PSPNet(Pyramid Scene Parsing Network)来自于CVPR2017的一篇文章&#xff0c;中文翻译为金字塔场景解析…

【Java-LangChain:使用 ChatGPT API 搭建系统-6】处理输入-链式 Prompt Chaining Prompts

第六章&#xff0c;处理输入-链式 Prompt Chaining Prompts 在本章中&#xff0c;我们将学习如何通过将复杂任务拆分为一系列简单的子任务来链接多个 Prompt。 您可能会想&#xff0c;为什么要将任务拆分为多个 Prompt&#xff0c;而不是像我们在上一个视频中学习的那样&…

【Java-LangChain:面向开发者的提示工程-7】文本扩展

第七章 文本扩展 扩展是将短文本&#xff08;例如一组说明或主题列表&#xff09;输入到大型语言模型中&#xff0c;让模型生成更长的文本&#xff08;例如基于某个主题的电子邮件或论文&#xff09;。这种应用是一把双刃剑&#xff0c;好处例如将大型语言模型用作头脑风暴的伙…

基于SpringBoot的体育馆场地赛事预约管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

unordered_map/unordered_set的学习[unordered系列]

文章目录 1.老生常谈_遍历2.性能测试3.OJ训练3.1存在重复元素3.2两个数组的交集Ⅱ3.3两句话中的不常见单词3.4两个数组的交集3.5在长度2N的数组中找出重复N次的元素 1.老生常谈_遍历 #pragma once #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <l…