【无标题】C++UDP通信类

简介

调用系统WinSock2和ws2tcpip底层函数,实现了CUdpSocket类,完成了网络通信。本人用Qt工程编写,故在Pro文件内容,添加LIBS += -lpthread libwsock32 libws2_32库链接相关内容,如果使用添加编译器请在.ccp内容添加静态链接#pragma comment (lib,“ws2_32.lib”)。

CUdpSocket.h代码

#ifndef CUDPSOCKET_H
#define CUDPSOCKET_H
#include <ws2tcpip.h>

class CUdpSocket
{
public:
    CUdpSocket();
    ~CUdpSocket();
    /**
     * @brief intUdp   初始化UDPsocket
     * @param LocalIpAddr 本地IP地址
     * @param usLocalPort 本地端口
     * @param RemotIpAddr  远端IP地址
     * @param usRemotePort  远端IP端口
     * @return
     */
    bool intUdp(const char* LocalIpAddr,unsigned short usLocalPort,const char* RemotIpAddr="",unsigned short usRemotePort=0);
    /**
     * @brief recvUpdData 接收UDP数据函数
     * @param buf      接收数据首地址
     * @param iMaxSize  最大接收长度
     * @param timeoutMs 超时时间
     * @return
     */
    int recvUpdData(char *buf,int iMaxSize,int timeoutMs);
    /**
     * @brief SndUpdData  发送Udp数据函数
     * @param buf         发送数据首地址
     * @param len         发送数据长度
     * @return
     */
    int SndUpdData(const char *buf,int len);
    /**
     * @brief SndUpdData  发送Udp数据函数
     * @param buf         发送数据首地址
     * @param len         发送数据长度
     * @param DstIpAddr 目标IP地址
     * @param usDstPort 目标端口
     * @return
     */
    int SndUpdData(const char *buf,int len,const char* DstIpAddr,unsigned short usDstPort);
private:
    SOCKET  m_udpSockfd;
    sockaddr_in mRemotAddr;
};

#endif // CUDPSOCKET_H

CUdpSocket.cpp代码


```cpp
#include "cudpsocket.h"
#include <WinSock2.h>
#include <stdio.h>
CUdpSocket::CUdpSocket()
{
    WSADATA  wsData;
    int nret=WSAStartup(MAKEWORD(2, 2), &wsData);
    if(nret!=0)
    {
        printf("WSAStartup Error nret=%d",nret);
    }
    //1.创建UDP的socket(协议族, sokcet类型)
   m_udpSockfd = socket(AF_INET, SOCK_DGRAM, 0);
   if (m_udpSockfd==INVALID_SOCKET)
   {
       printf("create socket Error errorcode=%d",WSAGetLastError());
       return ;
   }
}

CUdpSocket::~CUdpSocket()
{
    closesocket(m_udpSockfd);
    // 清理Socket
    WSACleanup();
}

bool CUdpSocket::intUdp(const char *LocalIpAddr, unsigned short usLocalPort, const char *RemotIpAddr, unsigned short usRemotePort)
{
    bool bResult=true;
    //2.设置Socket的连接地址、方式和端口,并绑定
    sockaddr_in LocalAddr;
    LocalAddr.sin_family = AF_INET; //设置使用的协议族
    LocalAddr.sin_port = htons(usLocalPort); //设置使用的端口
    LocalAddr.sin_addr.S_un.S_addr = inet_addr(LocalIpAddr); //设置绑定的IP地址

    mRemotAddr.sin_family = AF_INET; //设置使用的协议族
    mRemotAddr.sin_port = htons(usRemotePort); //设置使用的端口
    mRemotAddr.sin_addr.S_un.S_addr = inet_addr(RemotIpAddr); //设置绑定的IP地址
    if(bind(m_udpSockfd, (sockaddr*)&LocalAddr, sizeof(sockaddr))==-1)
    {
        printf("bind failed \n");
        bResult=false;
    }
    return bResult;
}
int CUdpSocket::recvUpdData(char *buf, int iMaxSize, int timeoutMs)
{
    fd_set fdRead;
    timeval timeout;
    timeout.tv_sec = 0;
    timeout.tv_usec = timeoutMs;
    FD_ZERO(&fdRead);
    FD_SET(m_udpSockfd, &fdRead);
    int ret = select(0, &fdRead, NULL, NULL, &timeout);
    int nlen = 0;
    if(ret == SOCKET_ERROR)
    {
        ret=SOCKET_ERROR;
    }
    else if(ret == 0)//超时
    {
        ret=0;
    }
    else if(ret > 0)
    {
        nlen=recvfrom(m_udpSockfd, buf, iMaxSize, 0, NULL,NULL);
    }
    return nlen;
}

int CUdpSocket::SndUpdData(const char *buf, int len)
{
   return sendto(m_udpSockfd, buf, len, 0, (SOCKADDR*)&mRemotAddr,sizeof(sockaddr));
}

int CUdpSocket::SndUpdData(const char *buf, int len, const char* DstIpAddr,unsigned short usDstPort)
{
    sockaddr_in dstSockAddr;
    dstSockAddr.sin_family = AF_INET; //设置使用的协议族
    dstSockAddr.sin_port = htons(usDstPort); //设置使用的端口
    dstSockAddr.sin_addr.S_un.S_addr = inet_addr(DstIpAddr); //设置绑定的IP地址
    return sendto(m_udpSockfd, buf, len, 0, (SOCKADDR*)&dstSockAddr,sizeof(sockaddr));
}

main.cpp 调用示例


```cpp
#include <QCoreApplication>
#include "cudpsocket.h"
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    CUdpSocket udpsocket;
    char buf[1024];
    udpsocket.intUdp("127.0.0.1",2024,"127.0.0.1",2025);
    while(1)
    {
        int Len=udpsocket.recvUpdData(buf,1024,100);
        if(Len>0)
        {
            udpsocket.SndUpdData(buf,Len);
        }
    }
    return a.exec();
}
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蛮v蛮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值