C++学习_udp协议(socket)的封装

2023-05-16

C++学习笔记,UDP(socket)协议的封装实现
1.配置QT下的pro文件


 1 TEMPLATE = app
 2 CONFIG += console
 3 CONFIG -= app_bundle
 4 CONFIG -= qt
 5  
 6 LIBS += -lWs2_32 ##标示使用window下的Ws2_32.lib,-l表示要链接后面的库
 7 #-lWs2_32,link Ws2_32.lib
 8  
 9 SOURCES += main.cpp \
10     udp.cpp
11 
12 include(deployment.pri)
13 qtcAddDeployment()
14 
15  
16 HEADERS += \
17     udp.h   

 

 

 

2.编写udp.h文件


 1 #ifndef UDP_H
 2 #define UDP_H
 3 
 4 #ifdef MYLINUX
 5 
 6 #include <unistd.h>
 7 #include <arpa/inet.h>
 8 #include <sys/types.h> /* See NOTES */
 9 #include <sys/socket.h>
10 
11 #define SOCKET int
12 
13 #else
14 #include <winsock2.h>
15 #endif
16 
17 class myudp
18 {
19 private:
20     SOCKET st;//类的内部成员一般是不暴露在外面的
21 public:
22     myudp();
23     ~myudp();
24 
25 int socket_send(const char * IP,const char *buf, int len);
26 int socket_recv(char *buf, int len, char * srcIP);
27 int socket_bind(short int port);
28 };
29 
30 #endif // UDP_H   

 

 

3.编写udp.cpp


 1 #include <string.h>
 2 #include <stdio.h>
 3 #include "udp.h"
 4 
 5 //#define MYLINUX ---- linux 下 makefile文件定义 -DMYLINUX
 6 
 7 
 8 
 9 
10 
11 int myudp::socket_send(const char * IP,const char *buf, int len)
12 {
13 
14     st = socket(AF_INET, SOCK_DGRAM, 0);
15     //建立一个socket,第一个参数是指定socket要用哪个协议,AF_INET代表要用TCP/IP协议
16     //第二个参数SOCK_DGRAM意思是要用UDP协议
17     //第三个参数一般默认填0
18     struct sockaddr_in addr;
19     memset(&addr, 0, sizeof(addr));//初始化结构addr
20     addr.sin_family = AF_INET;//代表要使用一个TCP/IP的地址
21     addr.sin_port = htons(8080);//host to net short
22     addr.sin_addr.s_addr = inet_addr(IP);
23     //IP地址解析
24     //unsigned long laddr = inet_addr("192.168.6.200");
25     //unsigned char *p = &laddr;
26     //printf("%u, %u, %u, %u\n", *(p), *(p+1), *(p+2), *(p+3));
27 
28     size_t rc = 0;
29 
30     //发送udp数据
31     rc = sendto(st,buf,len,0,(struct sockaddr *)&addr,sizeof(addr));
32 
33     return rc;
34 }
35 
36 int myudp::socket_recv(char *buf, int len, char * srcIP)
37 {
38     struct sockaddr_in sendaddr;//来自发送方的IP地址
39     memset(&sendaddr,0,sizeof(sendaddr));
40 
41 #ifdef MYLINUX
42     socklen_t len;
43 #else
44     int addrlen;
45 #endif
46     addrlen = sizeof(sendaddr);
47 
48 
49     memset(buf,0,len);
50     size_t rc = recvfrom(st,buf,len,0,(struct sockaddr *)&sendaddr,&addrlen);
51     //inet_ntoa(sendaddr.sin_addr);//这个函数是不可重入函数
52     //多线程调用,这个函数会出问题
53     if(srcIP)
54         strcpy(srcIP,inet_ntoa(sendaddr.sin_addr));
55     //printf("%s:\n%s\n", srcIP, buf);
56 return rc;
57 }
58 
59 myudp::myudp()
60 {
61 #ifndef MYLINUX
62     //初始化socket
63     DWORD ver;
64     WSADATA wsaData;
65     ver = MAKEWORD(1,1);//在调用WASStartup要告诉windows,我用什么版本的socket
66     WSAStartup(ver, &wsaData);//windows要求,只要用socket,第一步,必须调用这个函数
67     //初始化完成
68 #endif
69 
70     st = socket(AF_INET,SOCK_DGRAM,0);//定义一个socket
71 
72 }
73 
74 
75 myudp::~myudp()
76 {
77 #ifdef MYLINUX
78     close(st);
79 #else
80     closesocket(st);//关闭socket
81     WSACleanup();//释放win socket内部的相关资源
82 #endif
83 }
84 
85 
86 int myudp::socket_bind(short port)
87 {
88     struct sockaddr_in addr;
89     memset(&addr,0,sizeof(addr));//初始化addr
90     addr.sin_family = AF_INET;//代表要使用一个TCP/IP的地址
91     addr.sin_port = htons(port);
92     addr.sin_addr.s_addr = htonl(INADDR_ANY);//作为接收方,不需要指定具体的IP地址,接受的主机是什么IP,我就在什么IP接受数据
93     //addr.sin_addr.s_addr = inet_addr("192.168.2.100");
94 
95     return bind(st, (struct sockaddr *)&addr, sizeof(addr)); //将端口号和程序绑定
96 }   

 

 

4.main.c的实现代码


 1 #include <iostream>
 2 #include "udp.h"
 3 
 4 using namespace std;
 5 
 6 int main(int argc, char *args[])
 7 {
 8     if(argc > 1)
 9     {
10         myudp udp;
11         char buf[1024] = {0};
12         while(1)
13         {
14             memset(buf, 0, sizeof(buf));
15             gets(buf);
16             udp.socket_send(args[1],buf, strlen(buf));
17             if (strcmp(buf, "exit") == 0)
18                 break;
19         }
20 
21     }else
22     {
23         myudp udp;
24         char buf[1024] = {0};
25         if(udp.socket_bind(8080) > -1)
26         {
27             char ip[100] = {0};
28             while(1)
29             {
30                 memset(buf, 0, sizeof(buf));
31                 memset(ip, 0, sizeof(ip));
32                 udp.socket_recv(buf,sizeof(buf), ip);
33                 if (strncmp(buf, "exit", 4) == 0)
34                         break;
35                 cout << ip << endl;
36                 cout << buf << endl;
37             }
38         }
39     }
40 
41     cout << "over" << endl;
42     return 0;
43 }   

 

 

转载于:https://www.cnblogs.com/rainbow-xiaojian/p/9061257.html

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

C++学习_udp协议(socket)的封装 的相关文章

  • 为什么服务器不使用 C# 中的套接字接收本地传输中的所有 UDP 数据包?

    我有一个服务器和一个客户端应用程序 客户端将一堆数据包发送到服务器 使用的协议是UDP 客户端应用程序生成一个新线程来循环发送数据包 服务器应用程序还生成一个新线程来循环等待数据包 这两个应用程序都需要根据传输进度保持 UI 更新 如何正确
  • 我应该对 UDP 使用(非阻塞)NIO 吗?

    根据这个帖子 https stackoverflow com questions 569555 non blocking udp i o vs blocking udp i o in java UDP 只是不阻塞 使用 非阻塞 NIO AP
  • Golang编写的UDP客户端无法接收来自服务器的消息

    我写了一个Java客户端 它向广播地址发送消息 我还编写了一个Java服务器 它接受所有发送的消息并将消息发送回客户端 现在我想尝试在 Go 中做同样的事情 只是为了获得一些经验 服务器工作正常 正在接收消息并对 Java 客户端做出响应
  • 使用.Net Core创建UDP套接字

    如何创建一个 UDP 套接字以非阻塞方式接收本地端点中的数据 我不知道数据来自的远程端口 我在 Linux 中使用 NET Core 我认为我可以使用 ReceiveAsync 但它似乎无法以这种方式工作 我这样解决了这个问题 static
  • 丢包纠错码 (UDP)

    我不知道要寻找什么 因为我从 纠错代码 中得到的只是与您不知道错误位置的情况相关的内容 因此 这些代码比我需要的要复杂得多 而且效率低下 在下文中 请注意位等于数据包 因为只有整个数据包可能会丢失 因此位类比非常适合 是否有 ECC 考虑到
  • 什么是 STUN?它是否需要端口转发服务器?

    我对没有基础服务器的 p2p 通信进行了一些研究 并通过了 STUN 据我所知 STUN 是 NAT 打孔 的一种方式 不需要对等方进行端口转发即可连接 这是正确的吗 打孔到底是什么意思 这一切看起来都很脆弱 因为如果不需要端口转发 它就会
  • Java UDP中如何获取实际数据包大小`byte[]`数组

    这是我上一个问题的后续问题 Java UDP发送 接收数据包一一接收 https stackoverflow com questions 21866382 java udp send receive packet one by one 正如
  • 具有多个接口的 Python UDP 套接字

    我正在 Windows XP 机器上用 python2 7 编写脚本 本机使用不同的网卡连接到多个网络 我遇到了一个问题 我已将 UDP 套接字绑定到特定接口 我知道您可以通过仅提供网卡现有的 IP 地址来在 Windows 中完成此操作
  • C++ 反序列化通过 UDP 从 C# 应用程序发送的对象

    我有一个申请c 它连接到另一个应用程序 编写为c 通过UDP 我更喜欢高性能的解决方案 因为我希望测量事件客户端 某些处理服务器端和客户端处理完成的响应之间的时间 本质上是 往返延迟 我有一个 C 对象 例如 public class Pa
  • 移动提供商无法进行 UDP 打洞

    实际上 我正在编写一个 Android 应用程序 该应用程序接收连接到 PC 的网络摄像头的图片 为了获得更多的 fps 我使用 udp 协议而不是 tcp 这个想法是 电脑将图片发送到手机的 IP 和端口 但电话提供商有不同的公共端口 所
  • 如果客户端在服务器之后启动,则 GStreamer v1.0 UDP 多播流无法正确解码

    我正在尝试使用 GStreamer 进行 UDP 多播屏幕流传输 我的投屏服务器应该在 Windows 上运行 and my 客户端应在 Linux 上运行 如果我在服务器之前启动客户端 一切都很好 问题是当我启动客户端并且服务器已经启动时
  • HTTP 是否使用 UDP?

    这可能是一个愚蠢的问题 HTTP 是否使用过用户数据报协议 例如 如果使用 HTTP 传输 MP3 或视频 它内部是否使用 UDP 进行传输 From RFC 2616 http www ietf org rfc rfc2616 txt 通
  • C#/Unity - 无法从异步方法调用 Unity 方法

    我正在使用Unity3D 这是我的异步方法 private void Receive IAsyncResult ar try IPEndPoint ipEndPoint null byte data udpClient EndReceive
  • 什么是消息边界?

    什么是 消息边界 在以下情况下 TCP 和 UDP 之间的区别之一是 UDP 保留消息 边界 我理解之间的区别TCP and UDP 但我不确定的定义 消息边界 由于 UDP 在每个单独的数据包中包含目的地和端口信息 因此是否可以为消息提供
  • 我刚刚在哪个适配器上收到此 UDP 数据包?

    我正在尝试用 C 编写一个 BOOTP 服务器 我正在接收并解析来自客户端的 BOOTP 数据包 我需要回复我的服务器 IP 地址 问题是 计算机可以有多个网络适配器 客户端还没有 IP 地址 有什么方法可以查出 UDP 数据包是在哪个适配
  • 对等网络应用程序的网络发现

    我希望有两个类 一个服务器类和一个客户端类 服务器类应该接收每个新客户端的 IP 地址和端口号并将它们存储在列表中 它应该为每个客户端提供已连接客户端及其 IP 地址的列表 然后 客户端可以使用 TCP 连接相互通信 问题是客户端不知道服务
  • Python UDP广播不发送

    我正在尝试从 Python 程序到两个 LabView 程序进行 UDP 广播 我似乎无法发送广播 我不确定我的套接字初始化错误在哪里 广播似乎足够简单 据我所知 其他电脑没有收到任何数据 另外 我将来还需要这个程序来接收来自其他电脑的数据
  • 使用 Boost.Asio 进行广播的问题

    如果问题之前已得到解答 我提前表示歉意 但我已经搜索并没有找到任何对我有帮助的东西 正如问题标题所示 我正在尝试将包从服务器广播到一组侦听任何消息的客户端 客户端将计算一秒钟内收到的消息数 服务器端的事情是这样的 class Server
  • 为什么 SNMP 通常在 UDP 上运行而不是 TCP/IP 上?

    今天早上 工作中出现了大问题 因为 SNMP 陷阱没有 通过 因为 SNMP 是通过 UDP 运行的 我记得在大学网络课上 UDP 不能像 TCP IP 那样保证传输 维基百科说 SNMP 可以在 TCP IP 上运行 但 UDP 更常见
  • 为什么 UDP 服务器中只有一个套接字?

    我正在准备考试 发现了这个问题 典型的 UDP 服务器可以使用单个套接字来实现 解释一下为什么 对于 TCP 驱动的服务器 我发现创建了两个套接字 一个用于所有客户端访问服务器 另一个用于每个客户端的特定 套接字 用于服务器和客户端之间的进

随机推荐

  • Linux Socket基础介绍

    Linux Socket函数库是从Berkeley大学开发的BSD UNIX系统中移植过来的 BSD Socket接口是众多Unix系统中被广泛支持的TCP IP通信接口 xff0c Linux下的Socket程序设计 xff0c 除了微小
  • libcurl库的使用(通过libcurl库下载url图像)

    1 从http curl haxx se download html下载libcurl源码 xff0c 解压缩 xff1b 2 通过CMake cmake gui 生成vs2013 x64位 CURL sln xff1b 3 打开CURL
  • 人工神经网络简介

    本文主要对人工神经网络基础进行了描述 xff0c 主要包括人工神经网络的概念 发展 特点 结构 模型 本文是个科普文 xff0c 来自网络资料的整理 一 人工神经网络的概念 人工神经网络 xff08 Artificial Neural Ne
  • 卷积神经网络(CNN)基础介绍

    本文是对卷积神经网络的基础进行介绍 xff0c 主要内容包括卷积神经网络概念 卷积神经网络结构 卷积神经网络求解 卷积神经网络LeNet 5结构分析 卷积神经网络注意事项 一 卷积神经网络概念 上世纪60年代 xff0c Hubel等人通过
  • C++中struct的使用

    C 43 43 语言继承了C语言的struct xff0c 并且加以扩充 在C语言中struct是只能定义数据成员 xff0c 而不能定义成员函数的 而在C 43 43 中 xff0c struct类似于class xff0c 在其中既可以
  • Windows与Linux之间互传文件的方法

    以下方法均是以Windows为操作机 xff1a 1 通过WinSCP WinSCP是一款开源的SFTP客户端 xff0c 运行于Windows系统下 xff0c 遵照GPL发布 WinSCP除了SFTP xff0c 还支持SSH SCP
  • 非对称加密算法RSA公钥私钥的模数和指数提取方法

    生成非对称加密算法RSA公钥 私钥的方法 xff1a 1 通过OpenSSL库生成 xff0c 可参考 https github com fengbingchun OpenSSL Test blob master demo OpenSSL
  • Base64简介

    Base64是一种基于64个可打印字符来表示二进制数据的表示方法 由于2 6 61 64 xff0c 所以每6个比特为一个单元 xff0c 对应某个可打印字符 3个字节有24个比特 xff0c 对应于4个Base64单元 xff0c 即3个
  • HTTP协议简介

    HTTP HyperText Transfer Protocol 超文本传输协议 xff1a 是一种用于分布式 协作式和超媒体信息系统的应用层协议 HTTP是万维网的数据通信的基础 设计HTTP最初的目的是为了提供一种发布和接收HTML页面
  • HTTPS协议简介

    HTTPS HyperText Transfer Protocol Secure 超文本传输安全协议 xff1a 是一种透过计算机网络进行安全通信的传输协议 HTTPS经由HTTP进行通信 xff0c 但利用SSL TLS来加密数据包 HT
  • base64开源库介绍及使用

    网上有一些开源的base64编解码库的实现 xff0c 下面介绍几个 xff1a cppcodec是一个仅包括头文件的C 43 43 11库 xff0c 用于编解码RFC 4648中指定的base64 base64url base32 ba
  • Ubuntu下使用CMake编译OpenSSL源码操作步骤(C语言)

    OpenSSL的版本为1 0 1g xff0c 在ubuntu下通过CMake仅编译c代码不包括汇编代码 xff0c 脚本内容如下 xff1a build sh内容 xff1a bin bash real path 61 realpath
  • ImageNet图像数据集介绍

    ImageNet图像数据集始于2009年 xff0c 当时李飞飞教授等在CVPR2009上发表了一篇名为 ImageNet A Large Scale Hierarchical Image Database 的论文 xff0c 之后就是基于
  • 网络文件系统(NFS)简介

    网络文件系统 Network File System NFS 是一种分布式文件系统协议 xff0c 最初由Sun Microsystems公司开发 xff0c 并于1984年发布 其功能旨在允许客户端主机可以像访问本地存储一样通过网络访问服
  • 实时流协议(RTSP)简介

    RTSP Real Time Streaming Protocol xff0c RFC2326 xff0c 实时流传输协议 xff0c 是TCP IP协议体系中的一个应用层协议 xff0c 由哥伦比亚大学 网景 Netscape 和Real
  • 远程过程调用RPC简介

    RPC Remote Procedure Call 远程过程调用 xff1a 是一种通过网络从远程计算机程序上请求服务 xff0c 而不需要了解底层网络技术的思想 RPC是一种技术思想而非一种规范或协议 xff0c 常见RPC技术和框架有
  • C语言中头文件包含的处理原则

    很多事不深入以为自己懂了 xff0c 但真正用到项目上 xff0c 才发现了问题 曾以为自己写C语言已经轻车熟路了 xff0c 特别是对软件文件的工程管理上 xff0c 因为心里对自己的代码编写风格还是有自信的 毕竟刚毕业时老大对我最初的训
  • Unity3D物体自动躲避障碍物

    Unity版本 2017 4 4f1 基本思路 物体向前发射一个射线 xff0c 检测到碰撞后 xff0c 根据碰撞信息选择新的方向 最终结果如下 具体实现步骤代码 1 物体添加胶囊体碰撞组件CapsuleCollider 通过发射虚拟胶囊
  • nginx的请求接收流程(二)

    在ngx http process request line函数中 xff0c 解析完请求行之后 xff0c 如果请求行的uri里面包含了域名部分 xff0c 则将其保持在请求结构的headers in成员的server字段 xff0c h
  • C++学习_udp协议(socket)的封装

    C 43 43 学习笔记 xff0c UDP socket 协议的封装实现 1 配置QT下的pro文件 1 TEMPLATE 61 app 2 CONFIG 43 61 console 3 CONFIG 61 app bundle 4 CO