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;
}

 

目录
相关文章
|
10月前
|
C++ Windows
应用程序无法正常启动(0xc0000005)?C++报错0xC0000005如何解决?使命召唤17频频出现闪退,错误代码0xC0000005(0x0)
简介: 本文介绍了Windows应用程序出现错误代码0xc0000005的解决方法,该错误多由C++运行库配置不一致或内存访问越界引起。提供包括统一运行库配置、调试排查及安装Visual C++运行库等解决方案,并附有修复工具下载链接。
2545 1
|
存储 安全 C语言
C++ String揭秘:写高效代码的关键
在C++编程中,字符串操作是不可避免的一部分。从简单的字符串拼接到复杂的文本处理,C++的string类为开发者提供了一种更高效、灵活且安全的方式来管理和操作字符串。本文将从基础操作入手,逐步揭开C++ string类的奥秘,帮助你深入理解其内部机制,并学会如何在实际开发中充分发挥其性能和优势。
|
API 数据安全/隐私保护 C++
永久修改机器码工具, exe一机一码破解工具,软件机器码一键修改工具【c++代码】
程序实现了完整的机器码修改功能,包含进程查找、内存扫描、模式匹配和修改操作。代码使用
|
C++
爱心代码 C++
这段C++代码使用EasyX图形库生成动态爱心图案。程序通过数学公式绘制爱心形状,并以帧动画形式呈现渐变效果。运行时需安装EasyX库,教程链接:http://【EasyX图形库的安装和使用】https://www.bilibili.com/video/BV1Xv4y1p7z1。代码中定义了屏幕尺寸、颜色数组等参数,利用随机数与数学函数生成动态点位,模拟爱心扩散与收缩动画,最终实现流畅的视觉效果。
1312 0
|
API 网络安全
发送UDP数据免费API接口教程
此API用于向指定主机发送UDP数据,支持POST或GET请求。需提供用户ID、密钥、接收IP及端口、数据内容等参数。返回状态码和信息提示。示例中含公共ID与KEY,建议使用个人凭证以提高调用频率。
399 13
|
算法 安全 C++
提高C/C++代码的可读性
提高C/C++代码的可读性
434 4
|
网络协议 Linux 网络性能优化
Linux C/C++之TCP / UDP通信
这篇文章详细介绍了Linux下C/C++语言实现TCP和UDP通信的方法,包括网络基础、通信模型、编程示例以及TCP和UDP的优缺点比较。
946 0
Linux C/C++之TCP / UDP通信
|
Linux C语言 C++
vsCode远程执行c和c++代码并操控linux服务器完整教程
这篇文章提供了一个完整的教程,介绍如何在Visual Studio Code中配置和使用插件来远程执行C和C++代码,并操控Linux服务器,包括安装VSCode、安装插件、配置插件、配置编译工具、升级glibc和编写代码进行调试的步骤。
4364 0
vsCode远程执行c和c++代码并操控linux服务器完整教程
2合1,整合C++类(Class)代码转换为MASM32代码的平台
2合1,整合C++类(Class)代码转换为MASM32代码的平台
继续更新完善:C++ 结构体代码转MASM32代码
继续更新完善:C++ 结构体代码转MASM32代码