UDP(socket)接和数据案例封装成C++代码

简介:  配置QT下的pro文件 TEMPLATE = app CONFIG += console CONFIG -= app_bundle CONFIG -= qt   LIBS += -lWs2_32   ##标示使用window下的Ws2_32.lib,-l表示要链接后面的库 #-lWs2_32,link Ws2_32.lib   SOURCES +

  1. 配置QT下的pro文件

TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt
 
LIBS += -lWs2_32   ##标示使用window下的Ws2_32.lib-l表示要链接后面的库
#-lWs2_32link Ws2_32.lib
 
SOURCES += main.cpp \
    udp.cpp
 
HEADERS += \
    udp.h

 

  1. 编写udp.h文件

#ifndef UDP_H

#define UDP_H

 

#ifdef MYLINUX

#include <sys/types.h>

#include <sys/socket.h>

#include <arpa/inet.h>

#include <unistd.h>

#define SOCKET int

#else

#include <winsock2.h>

#endif

 

class myudp

{

private:

    SOCKET st;//类的内部成员一般是不暴露在类外部的

public:

    myudp();

    myudp(const myudp &it);

    ~myudp();

int socket_bind(short int port);

int socket_send(const char *IP, const char *buf, int len);

int socket_recv(char *buf, int len, char *srcIP);

};

 

#endif // UDP_H

 

3.编写udp.cpp

#include <stdio.h>
#include <string.h>
#include "udp.h"
 
int myudp::socket_send(const char *IP, const char *buf, int len)
{
    //建立一个socket,第一个参数是指定socket要用那个协议,AF_INET代表要用TCP/IP协议
    //第二个参数SOCK_DGRAM意思是要用UDP协议
    //第三个参数一般默认填0
    st = socket(AF_INET, SOCK_DGRAM, 0);//定义一个socket
    struct sockaddr_in addr;
    memset(&addr, 0, sizeof(addr));//初始化结构addr;
    addr.sin_family = AF_INET;//代表要使用一个TCP/IP的地址
    addr.sin_port = htons(8080);//host to net short
    addr.sin_addr.s_addr = inet_addr(IP);
    //unsigned long laddr = inet_addr("192.168.6.200");
    //unsigned char *p = &laddr;
    //printf("%u,%u,%u,%u\n", *(p), *(p + 1),*(p + 2), *(p + 3));
 
    size_t rc = 0;
    //发送udp数据
    rc = sendto(st, buf, len, 0, (struct sockaddr *)&addr, sizeof(addr));
    return rc;
}
 
int myudp::socket_recv(char *buf, int len, char *srcIP)
{
        struct sockaddr_in sendaddr;
        memset(&sendaddr, 0, sizeof(sendaddr));
 
#ifdef MYLINUX
        socklen_t addrlen;
#else
        int addrlen;
#endif
        addrlen = sizeof(sendaddr);
        memset(buf, 0, len);
        //接收udp数据
        size_t rc = recvfrom(st, buf, len, 0, (struct sockaddr *)&sendaddr, &addrlen);
        //inet_ntoa(sendaddr.sin_addr);//这个函数是不可重入函数
        if (srcIP)
            strcpy(srcIP, inet_ntoa(sendaddr.sin_addr));
    return rc;
}
 
myudp::myudp()
{
#ifndef MYLINUX
    //初始化socket
    DWORD ver;
    WSADATA wsaData;
    ver = MAKEWORD(1, 1);//在调用WSAStatrtup要告诉widnows,我用什么版本的socket
    WSAStartup(ver, &wsaData);//windows要求,只要用socket,第一步,必须调用这个函数
    //初始化socket完成
    //建立一个socket,第一个参数是指定socket要用那个协议,AF_INET代表要用TCP/IP协议
    //第二个参数SOCK_DGRAM意思是要用UDP协议
    //第三个参数一般默认填0
    st = socket(AF_INET, SOCK_DGRAM, 0);//定义一个socket
#endif
}
 
myudp::myudp(const myudp &it)
{
}
 
myudp::~myudp()
{
#ifdef MYLINUX
    close(st);
#else
    closesocket(st);//使用完socket要将其关闭
    WSACleanup();//释放win socket内部的相关资源
#endif
}
 
int myudp::socket_bind(short port)
{
    struct sockaddr_in addr;
    //初始化结构addr;
    memset(&addr, 0, sizeof(addr));
    //代表要使用一个TCP/IP的地址
    addr.sin_family = AF_INET;
    //host to net short
    addr.sin_port = htons(port);
    //做为接收方,不需要指定具体的IP地址,接收的主机是什么IP,我就在什么IP上收数据
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    int rc = 0;
    return bind(st, (struct sockaddr *)&addr, sizeof(addr));
}

4.main.c的实现代码

#include <iostream>
#include "udp.h"
 
using namespace std;
 
int main(int argc, char *args[])
{
    if (argc > 1)
    {
        myudp udp;
        char buf[1024] = {0};
        while(1)
        {
            memset(buf, 0, sizeof(buf));
            gets(buf);
            udp.socket_send(args[1], buf, strlen(buf));
            if (strncmp(buf, "exit", 4) == 0)
                break;
        }
    }
    else
    {
        myudp udp;
        char buf[1024] = {0};
        if (udp.socket_bind(8080) > -1)
        {
            char ip[100] = {0};
            while(1)
            {
                memset(buf, 0, sizeof(buf));
                memset(ip, 0, sizeof(ip));
                udp.socket_recv(buf, sizeof(buf), ip);
                if (strncmp(buf, "exit", 4) == 0)
                    break;
                cout << buf << endl;
                cout << ip << endl;
            }
        }
    }
 
    cout << "over" << endl;
    return 0;
}

 

目录
相关文章
|
7月前
|
存储 监控 算法
基于 C++ 哈希表算法实现局域网监控电脑屏幕的数据加速机制研究
企业网络安全与办公管理需求日益复杂的学术语境下,局域网监控电脑屏幕作为保障信息安全、规范员工操作的重要手段,已然成为网络安全领域的关键研究对象。其作用类似网络空间中的 “电子眼”,实时捕获每台电脑屏幕上的操作动态。然而,面对海量监控数据,实现高效数据存储与快速检索,已成为提升监控系统性能的核心挑战。本文聚焦于 C++ 语言中的哈希表算法,深入探究其如何成为局域网监控电脑屏幕数据处理的 “加速引擎”,并通过详尽的代码示例,展现其强大功能与应用价值。
162 2
|
8月前
|
存储 C++
UE5 C++:自定义Http节点获取Header数据
综上,通过为UE5创建一个自定义HTTP请求类并覆盖GetResult方法,就能成功地从HTTP响应的Header数据中提取信息。在项目中使用自定义类,不仅可以方便地访问响应头数据,也可随时使用这些信息。希望这种方法可以为你的开发过程带来便利和效益。
287 35
|
10月前
|
算法 Serverless 数据处理
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
328 12
|
10月前
|
存储 监控 算法
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
196 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
|
11月前
|
存储 算法 搜索推荐
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
230 5
|
网络协议 Linux 网络性能优化
Linux C/C++之TCP / UDP通信
这篇文章详细介绍了Linux下C/C++语言实现TCP和UDP通信的方法,包括网络基础、通信模型、编程示例以及TCP和UDP的优缺点比较。
572 0
Linux C/C++之TCP / UDP通信
|
编译器 C++
【C++核心】指针和引用案例详解
这篇文章详细讲解了C++中指针和引用的概念、使用场景和操作技巧,包括指针的定义、指针与数组、指针与函数的关系,以及引用的基本使用、注意事项和作为函数参数和返回值的用法。
221 3
|
C++
【C++案例】一个项目掌握C++基础-通讯录管理系统
这篇文章通过一个通讯录管理系统的C++项目案例,详细介绍了如何使用C++实现添加、显示、删除、查找、修改和清空联系人等功能。
279 3
|
JSON 前端开发 JavaScript
socket.io即时通信前端配合Node案例
本文介绍了如何使用socket.io库在Node.js环境下实现一个简单的即时通信前端配合案例,包括了服务端和客户端的代码实现,以及如何通过socket.io进行事件的发送和监听来实现实时通信。
300 2
|
数据安全/隐私保护 C语言 C++
C++(七)封装
本文档详细介绍了C++封装的概念及其应用。封装通过权限控制对外提供接口并隐藏内部数据,增强代码的安全性和可维护性。文档首先解释了`class`中的权限修饰符(`public`、`private`、`protected`)的作用,并通过示例展示了如何使用封装实现栈结构。接着介绍了构造器和析构器的使用方法,包括初始化列表的引入以及它们在内存管理和对象生命周期中的重要性。最后,通过分文件编程的方式展示了如何将类定义和实现分离,提高代码的模块化和复用性。