码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【计算机网络】 基于UDP的简单通讯(客户端)


    文章目录

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

    客户端

    在这里插入图片描述

    流程

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

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

    代码实现
    添加头文件以及库依赖
    #include
    #include
    
    #pragma comment(lib,"Ws2_32.lib")
    
    using namespace std;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    加载库
    	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;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    创建套接字
    	//创建套接字
    	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;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    发送接收数据

    因为我们要发给服务端,并且服务端在自己的设备上,所以我们需要创建一个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;
    		}
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    关闭套接字、卸载库
    	closesocket(sock);
    	WSACleanup();
    
    • 1
    • 2

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

    测试

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

    在这里插入图片描述

    没有问题!

  • 相关阅读:
    【数据结构】栈
    10.5 认识XEDParse汇编引擎
    Python 序列化与反序列化(pickle 标准库的使用)
    Java 21 新特性:switch的模式匹配
    使用 VS Code + Markdown 编写 PDF 文档
    【数据结构】线性表(二)单链表及其基本操作(创建、插入、删除、修改、遍历打印)
    Redis学习笔记14:基于spring data redis及lua脚本ZSET有序集合实现环形结构案例及lua脚本如何发送到redis服务器
    Java基础深化和提高-------IO流
    voc(xml)标签查询种类并打印
    千巡翼X1 让航测无人机更小更轻更高效
  • 原文地址:https://blog.csdn.net/jia_03/article/details/133325910
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号