UDP的客户端和服务器端的实例(VC6.0实现)

2023-05-16

服务器端程序:

// UdpServer.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>

//使用winsock所需的头文件
#include <WINSOCK.H>
//使用winsock所需的库文件
#pragma comment(lib,"WSOCK32.LIB")

//程序中要使用的winsock的主版本
#define SOCK_VER 2

//定义变量和函数
SOCKET g_sock = 0;
void ErrMsg(DWORD dwErr);



int main(int argc, char* argv[])
{
	//初始化环境
	WSADATA wd = {0};
	int nStart = WSAStartup(MAKEWORD(SOCK_VER,0),&wd);//函数成功返回0,失败返回错误代码
	if (0 != nStart)
	{//错误处理
		return 0;
	}

	if (2 != LOBYTE(wd.wVersion))
	{
		return 0;
	}

	//创建socket套接字
	g_sock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
	if (INVALID_SOCKET == g_sock)
	{
		ErrMsg(WSAGetLastError());
		return 0;
	}

	printf("socket 创建成功!!\n");

	//绑定
	sockaddr_in addr = {0};
	addr.sin_family = AF_INET;
	addr.sin_port = htons(2800);
	addr.sin_addr.s_addr = inet_addr("127.0.0.1");

	int nBind = bind(g_sock,(sockaddr *)&addr,sizeof(addr));//成功返回0
	if (0 != nBind)
	{
		ErrMsg(WSAGetLastError());
		return 0;
	}

	//获得已经绑定的端口号
	int nLen = sizeof(addr);
	getsockname(g_sock,(sockaddr *)&addr,&nLen);

	printf("socket 成功绑定到端口:%d,等待数据。。。\n",ntohs(addr.sin_port));

	//等待并接收数据
	sockaddr_in saClient = {0};
	int nFromLen = sizeof(saClient);
	char szBuff[256] = {0};
	recvfrom(g_sock,szBuff,256,0,(sockaddr *)&saClient,&nFromLen);
	printf("收到的信息:%s,从%s,%d \n",szBuff,inet_ntoa(saClient.sin_addr),ntohs(saClient.sin_port));

	//向客户端发送回应
	strcpy(szBuff,"OK!");
	int nSent = sendto(g_sock,szBuff,strlen(szBuff)+1,0,(sockaddr *)&saClient,sizeof(saClient));

	if (0 == nSent)
	{
		ErrMsg(WSAGetLastError());
	}
	else
	{
		printf("成功发出回应!!\n");

	}

	//关闭资源
	closesocket(g_sock);//关闭套接字
	system("pause");

	WSACleanup();//清理环境
		
	return 0;
}

//打印错误信息函数
void ErrMsg(DWORD dwErr)
{
	char szErr[1024] = {0};
	FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,NULL,dwErr,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),szErr,1024,NULL);
	printf(szErr);
	

}


客户端程序:

// UdpClient.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <WINSOCK.H>//套接字所需的头文件

#pragma comment(lib,"WSOCK32.LIB")//windows套接字的库文件

#define SOCK_VER 2 //程序使用的winsock主版本

//变量和函数的声明
SOCKET g_sock = 0; //套接字声明
void ErrMsg(DWORD dwErr);//错误信息打印


int main(int argc, char* argv[])
{
	//初始化WinSock环境
	WSADATA wd = {0};
	int nStart = WSAStartup(MAKEWORD(SOCK_VER,0),&wd);
	if (0 != nStart)
	{
		return 0;
	}

	if (LOBYTE(wd.wVersion) != 2)
	{
		return 0;
	}

	//创建一个UDP SOCKET 

	g_sock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
	if (INVALID_SOCKET == g_sock)
	{
		ErrMsg(WSAGetLastError());
		return 0;
	}

	printf("socket 创建成功!!\n");

	//发送数据的目标地址
	sockaddr_in addr = {0};
	addr.sin_family = AF_INET;//IPV4
	addr.sin_port = htons(2800);//端口
	addr.sin_addr.s_addr = inet_addr("127.0.0.1");//IP

	//发送数据包
	char szBuff[] = "hello UDP!!";
	int nSent = sendto(g_sock,szBuff,strlen(szBuff)+1,0,(sockaddr * )&addr,sizeof(addr));
	if (0 == nSent)
	{
		ErrMsg(WSAGetLastError());
	}
	else
	{
		printf("信息成功发送,等待回应。。\n");
	}

	//等待回应
	sockaddr_in saServer = {0};
	int nFromLen = sizeof(saServer);
	*szBuff = '\0';//清空缓冲区
	int nRecv = recvfrom(g_sock,szBuff,256,0,(sockaddr *)&saServer,&nFromLen);

	if (SOCKET_ERROR ==  nRecv)
	{
		ErrMsg(WSAGetLastError());
	}
	else
	{
		printf("收到回应:%s从%s,%d\n",szBuff,inet_ntoa(saServer.sin_addr),ntohs(saServer.sin_port));

	}

	//关闭连接套接字
	closesocket(g_sock);
	system("pause");

	//清理套接字环境
	WSACleanup();


	return 0;
}

//打印错误信息函数
void ErrMsg(DWORD dwErr)
{
	char szErr[1024] = {0};
	FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,NULL,dwErr,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),szErr,1024,NULL);
	printf(szErr);
}

 运行结果:

服务器端结果:

socket 创建成功!!
socket 成功绑定到端口:2800,等待数据。。。
收到的信息:hello UDP!!,从127.0.0.1,54381
成功发出回应!!
请按任意键继续. . .


客户端结果:

socket 创建成功!!
信息成功发送,等待回应。。
收到回应:OK!从127.0.0.1,2800
请按任意键继续. . .


 

标注:建立工程时选择新建一个新的简单工程,这样可以在创建一个新的工程里包含stdafx.h的头文件和cpp文件

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UDP的客户端和服务器端的实例(VC6.0实现) 的相关文章

  • STM32官方标准固件库开发与寄存器开发的区别

    一句话概括关系 xff1a 固件库就是函数的集合 xff0c 固件库函数的作用就是 xff1a 向下负责与寄存器直接打交道 xff0c 向上提供用户函数调用的接口 xff08 API xff09 对于STM32这种级别的MCU xff0c
  • CMake获取目录下所有源文件

    1 aux source directory指令 aux source directory lt dir gt lt variable gt 比如 xff1a aux source directory CMAKE CURRENT SOURC
  • Qt制作视频播放器

    前言 该播放器参考了SMPlayer xff0c 实现了其基础功能 xff0c 许多高级功能暂未实现 软件的实现基于Qt xff0c opencv xff0c 多线程以及数据库等相关知识 功能概述 支持本地音视频在线播放 xff0c url
  • Qt中QString与String的互相转换

    前言 Qt中的一些类型是Qt自己封装的 xff0c 例如我们平常常见的String在Qt中就是QString xff0c 但是有时我们调用第三方库时 xff0c 参数要求是String xff0c 这时我们就需要把QString转换成Str
  • Mat与QImage互相转换

    前言 Mat是opencv中的存储图像的容器 xff0c 也是图像像素矩阵 QImage是Qt中存储图片常用的类 Qt和opencv经常配合在一起使用 xff0c 但Qt的函数方法的参数是不接受Mat的 xff0c 所以如果我们想要在Qt中
  • CentOS7下安装libevent

    前言 CentOS7下安装libevent网络库 步骤 创建一个文件夹libevent xff08 方便后期维护管理 xff09 mkdir libevent 官网下载源码包 可以在本机下载然后文件传输 xff0c 也可以直接在linux下
  • Libevent源码深度剖析-张亮(转载)

    https blog csdn net xp178171640 article details 105490027
  • Qt6.4.3编译MySQL驱动

    前段时间电脑坏了重装了操作系统 软件都不能正常运行 大部分都得重装 本来用的Qt5 14 2 想着Qt都出6了 那就用用Qt6吧 Qt6想用mysql数据库也是得自己编译驱动的 但Qt6也是想推广CMake 所以我以前Qt5那一套编译mys
  • keil5中如何在一个项目中新建源文件

    哈喽哈喽 xff0c 昨天在学习如何点灯的时候接触到可以在一个已经建立好的项目中 xff0c 建立一个新的源文件写一个新的代码 这里就总结一下 点开file选择new xff0c 就会发现右边多个栏就说明源文件多了一个 xff0c 这个时候
  • 【Python数据分析】Python模拟登录(一) requests.Session应用

    最近由于某些原因 xff0c 需要用到Python模拟登录网站 xff0c 但是以前对这块并不了解 xff0c 而且目标网站的登录方法较为复杂 xff0c 所以一下卡在这里了 xff0c 于是我决定从简单的模拟开始 xff0c 逐渐深入地研
  • 【VSCode】C++环境配置(小白必看)

    关于VSCode的c 43 43 环境配置 网上教程很多 xff0c 但大多是入门的新手小白难以理解 xff0c 操作不来的 xff0c 作者本人也是捣鼓了很久才配置好c 43 43 运行环境 本篇文章会从头到尾简述 一下vscode配置c
  • at89c51单片机设计的智能空调系统 制冷制热加湿除湿四个工作模式 按键和手机App遥控两种控制方式

    at89c51单片机设计的智能空调系统 制冷制热加湿除湿四个工作模式 按键和手机App遥控两种控制方式 半导体制冷片模拟除湿制冷 超声波雾化模块加湿 温湿度传感器检查环境温湿度 LCD液晶屏显示系统工作状态 全套包括实物成品 xff0c 原
  • Java常用类 - String类详解

    Java常用类 String类 创建字符串 xff1a 每个双引号括起来的字符串常量都是String类的一个实例 xff1b 也可以new 连接字符串 xff1a 43 xff1b string1 concat string2 span c
  • 如何利用#将宏定义中的参数插入到字符串中?

    首先明白几个原理 xff1a 在宏定义中 xff0c 如果宏参数为字符串 xff0c 可以把这个字符串放到字符串中 xff0c 但如果宏参数为变量的话就不可以 可以把宏定义中的参数转化为相应的字符串 xff0c 这时就可以把这个参数放到字符
  • ssmJavaEE无人机数据管理系统 毕业设计源码111022

    ssm无人机数据管理系统 摘 要 随着互联网趋势的到来 xff0c 各行各业都在考虑利用互联网将自己推广出去 xff0c 最好方式就是建立自己的互联网系统 xff0c 并对其进行维护和管理 在现实运用中 xff0c 应用软件的工作规则和开发
  • 【C语言】字符串函数strcat即自主实现

    目录 一 strcat函数 二 自主实现strcat 一 strcat函数 1 功能 xff1a 连接字符串 将源字符串的副本追加到目标字符串 目标中的终止空字符被源的第一个字符覆盖 xff0c 并在目标中两者的连接形成的新字符串的末尾包含
  • 2023版Postman接口测试使用全指南(原来使用 Postman测试API接口如此简单)

    下面是一篇详细介绍postman接口测试的文章 xff0c 如果文章内容不太明白的话 xff0c 我建议看看视频版本 xff0c 更加清洗 xff0c 更加直观 xff01 最详细的postman接口测试实战教程 哔哩哔哩 bilibili
  • Qt QDebug格式输出、自定义类输出及重定向输出Log

    1 qDebug 格式化输出 qDebug格式化支持printf的格式化标识符 如果向函数传递格式字符串和参数列表 xff0c 它的工作方式类似于C printf 函数 格式应该是Latin 1字符串 格式化demo 代码如下 xff08
  • Qt读取GPS数据

    1 型号版本 GPS型号为ublox xff08 EVK M8L xff09 xff0c 配有USB接口 xff0c Qt版本5 7 2 实现步骤 xff1a 1 实现串口通信 采用Qt5 7 内置的串口操作类QSerialPort和QSe
  • 解决问题备忘:Http头Authorization值格式错误,请参考《微信支付商户REST API签名规则》

    环境 xff1a php7 3 4nts lt php 新手 xff0c 不会较为规范的代码 xff0c 如下 xff1a header 34 Access Control Allow Origin 34 openid 61 empty G

随机推荐

  • C语言 在字符串1中找字符串2首次出现的位置(strstr的缩减版)

    目录 题目 一 想法 二 实现代码 1 strstr 函数部分 注意点 2 main函数部分 3 完整代码 总结 题目 描述 编写一个函数 xff0c 函数的目的是在字符串1中找字符串2首次出现的位置 xff1b 输入 分为两行 xff0c
  • STM32F103之点亮LED二、结构体封装寄存器

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 点亮LED二 xff1a 合封寄存器之结构体 前言一 基地址分析二 结构体封装寄存器三 引用结构体总结 前言 外设寄存器的地址都是基于外设
  • 彻底解决cmake编译过程中fatal error: OpenNI.h: 没有那个文件或目录

    环境 xff1a ubuntu20 04 在cmake编译过程中 xff0c 最常见的莫过于fatal error xxxx h 没有那个文件或目录 这个问题困扰着很多初学者 xff0c 原因是没有找到某个头文件 xff0c 小白版的解决方
  • 【Ubuntu20.04网络配置--设置静态IP ping通开发板 】

    Ubuntu20 04网络配置 设置静态IP ping通开发板 环境准备windows 主机网络配置开发板 ping Windows主机ubuntu 网络配置配置ubuntu网络设置静态IP 修改IP配置文件让设置的静态IP配置生效查看配置
  • 在ros2 foxy安装镭神M10激光雷达

    前言 记录ros2 机器人开发历程 xff0c 全当做个笔记 xff0c 以后用到好查找 xff0c 也给后来者留下一些脚印 提示 xff1a 以下是本篇文章正文内容 xff0c 下面案例可供参考 一 环境 环境 xff1a ubuntu
  • Authentication认证和Authorization授权的作用

    认证 Authentication xff1a 你是谁 授权 Authorization xff1a 你有权限干什么 认证意味着确认自己的身份 xff0c 而授权意味着授予对系统的访问权限 简单来说 xff0c 认证是验证身份的过程 xff
  • 51单片机串口通信的原理及使用方法(附串口收发数据例程代码)

    温馨提示 xff1a 本篇文章详细介绍了串口的原理及使用方法 xff0c 涉及的内容较多 xff0c 但也较为全面 xff0c 学者若想充分掌握串口通信的原理和具体使用方法 xff08 部分限于51单片机 xff09 xff0c 请静下心来
  • RoboMaster大疆开发板C型入门学习(1)配置加流水灯(循环亮灯

    cubeMX新建工程 xff0c 这里我们假设已经安装好了cubeMX 我们本次使用Clion进行相关操作 在这里我们使用STM32F407IGHx芯片 在System Core下选择RCC选项 xff0c 在RCC mode and Co
  • 如何使用cvx工具箱求解凸优化问题呢?

    以下是一个简单的MATLAB求解凸优化问题的案例 xff0c 使用cvx 工具箱求解 xff1a 1 导入cvx工具箱 addpath 39 cvx 39 2 定义问题 n 61 2 变量数量 x 61 sym 39 x 39 n 1 定义
  • 基于stm32单片机智能导盲拐杖源程序Proteus仿真设计

    功能介绍 xff1a 采用stm32单片机作为主控CPU xff0c 采用srf05超声波模块测量障碍物距离 xff0c LCD1602显示屏显示当前的障碍物距离 xff0c 通过传感器测量障碍物的距离的远近来进行相关报警 xff0c 距离
  • virtualbox上安装ubuntu20.04清华源镜像

    一 下载Ubuntu镜像文件 这里我选择国内清华源下载ubuntu镜像文件 步骤一 xff1a 清华源下载地址 xff1a Index of ubuntu releases 20 04 清华大学开源软件镜像站 Tsinghua Open S
  • 计算机视觉(一):初识OpenCV,更好更快掌握OpenCV

    计算机视觉 xff08 一 xff09 xff1a 初识OpenCV 近几个月 xff0c 也是一直在寻找自己以后的方向 xff0c 一直在迷茫中 xff0c 但也在不断得探索着 觉得自己最感兴趣的还是计算机技术这一块 xff0c 尤其是计
  • 虚拟机扩容(超详细实测好用步骤)

    第一步 xff1a 把虚拟机关机 第二步 xff1a 点击编辑虚拟机设置 xff0c 选择硬盘 xff0c 点击扩展 xff0c 如下图 xff1a 第三步 xff1a 输入你现在想要的磁盘大小 xff08 如果你原来是200G xff0c
  • 结构体的对齐规则(结构体的计算)

    1 第一个成员在与结构体变量偏移量为0的地址处 2 其他成员变量要对齐到某个数字 xff08 对齐数 xff09 的整数倍的地址处 对齐数 61 编译器默认的一个对齐数 与 该成员大小的较小值 3 结构体总大小为最大对齐数 xff08 每个
  • hostapd 配置项解析

    hostapd 配置项解析 1 interface2 wps state3 hw mode4 channel5 beacon int6 max num sta 1 interface 一般默认interface 61 wlan0 注 xff
  • 滑动窗口算法总结

    算法目的 滑动窗口法 xff0c 也叫尺取法 xff08 可能也不一定相等 xff0c 大概就是这样 61 61 xff09 xff0c 可以用来解决一些查找满足一定条件的连续区间的性质 xff08 长度等 xff09 的问题 由于区间连续
  • linux软链接的创建、删除和更新

    大家都知道 xff0c 有的时候 xff0c 我们为了省下空间 xff0c 都会使用链接的方式来进行引用操作 同样的 xff0c 在系统级别也有 在Windows系列中 xff0c 我们称其为快捷方式 xff0c 在Linux中我们称其为链
  • 进程、线程、多进程、多线程的优缺点和区别

    进程 xff1a 是并发执行的程序在执行过程中分配和管理资源的基本单位 xff0c 是一个动态概念 xff0c 竞争计算机系统资源的基本单位 线程 xff1a 是进程的一个执行单元 xff0c 是进程内科调度实体 比进程更小的独立运行的基本
  • Postman 汉化(Postman中文版)

    1 首先从官网下载postMan安装包 postman官网下载地址 Download Postman Get Started for Free 2 下载postMan 汉化包 app zip postman汉化包 Releases hlmd
  • UDP的客户端和服务器端的实例(VC6.0实现)

    服务器端程序 xff1a UdpServer cpp Defines the entry point for the console application include 34 stdafx h 34 include lt stdio h