Qt UDP 通信

初始化windowsSDK

WORD sockVersion=MAKEWORD(2,2);
    WSADATA wsaData;
    if(WSAStartup(sockVersion,&wsaData)!=0)
    {
        qDebug()<<"ERROR"<<__FUNCTION__<<__LINE__;
    }
    else
    {
        qDebug()<<"SUCESS"<<__FUNCTION__<<__LINE__;

    }

申请socket并绑定本地端口

udpSocket=socket(AF_INET,SOCK_DGRAM,0);

struct sockaddr_in local;
local.sin_family = AF_INET;
local.sin_port = htons(12345);  //the port need listened
local.sin_addr.s_addr = INADDR_ANY; //localhost

bind(udpSocket,(struct sockaddr*)&local,sizeof(local));

发送数据

sockaddr_in sin;                //存放本地发送的目标端地址和端口

sin.sin_family=AF_INET;
sin.sin_port=htons(port);
sin.sin_addr.S_un.S_addr=inet_addr(ip.toStdString().c_str());
addrLen=sizeof(sin);

sendto(udpSocket,SendData.data(),SendData.size(),0,(sockaddr*)&sin,addrLen);

接收数据

sockaddr sin;
int len;
len=sizeof(sin);
unsigned char buf[2048]={0};

memset(buf,0,2048);
int recvLen= recvfrom(*udpSocket,(char*)buf,2048,0,&sin,&len);

源码头文件

#ifndef UDPSOCKET_H
#define UDPSOCKET_H

#include <QObject>
#include <windows.h>                      //windows socket
#include <winsock2.h>                     //windows socket 头文件
#include <winsock.h>
#include <QThread>
#include <QDebug>

class RecvThread:public QObject
{
    Q_OBJECT
public:
    RecvThread();
    ~RecvThread();
    void StartRecv();
    SOCKET *udpSocket;
    bool isRun=true;

public slots:
    void Recv();
signals:
    void ToRecv();
};

class UdpSocket:public QObject
{
    Q_OBJECT
public:
    UdpSocket();
    ~UdpSocket();
    void InitDll();
    void InitSocket();
    void SendData(QByteArray SendData);
    void SetSocketNoblock();
    SOCKET udpSocket;

    sockaddr_in sin;                //存放本地发送的目标端地址和端口
    QString ip;                     //目标IP
    int port;                       //目标端口
    int addrLen;                    //存放sin长度

    RecvThread recvThread;
    QThread myThread;
};



#endif // UDPSOCKET_H

源码CPP

#include "udpsocket.h"

UdpSocket::UdpSocket()
{
    InitDll();
    InitSocket();
    recvThread.moveToThread(&myThread);
    myThread.start();
    recvThread.StartRecv();
}
void UdpSocket::SetSocketNoblock()
{
    u_long argp = 1;
    ioctlsocket(udpSocket, FIONBIO, &argp);
}
UdpSocket::~UdpSocket()
{
    SetSocketNoblock();
    recvThread.isRun=false;
    myThread.quit();
    myThread.wait();
}

void UdpSocket::InitDll()
{
    WORD sockVersion=MAKEWORD(2,2);
    WSADATA wsaData;
    if(WSAStartup(sockVersion,&wsaData)!=0)
    {
        qDebug()<<"ERROR"<<__FUNCTION__<<__LINE__;
    }
    else
    {
        qDebug()<<"SUCESS"<<__FUNCTION__<<__LINE__;

    }
}

void UdpSocket::InitSocket()
{
    udpSocket=socket(AF_INET,SOCK_DGRAM,0);
    struct sockaddr_in local;
    local.sin_family = AF_INET;
    local.sin_port = htons(12345);  //the port need listened
    local.sin_addr.s_addr = INADDR_ANY; //localhost
    bind(udpSocket,(struct sockaddr*)&local,sizeof(local));

    int time=500;
    setsockopt(udpSocket,SOL_SOCKET,SO_RCVTIMEO,(char*)&time,sizeof(int));


    recvThread.udpSocket=&udpSocket;
}

void UdpSocket::SendData(QByteArray SendData)
{
    sin.sin_family=AF_INET;
    sin.sin_port=htons(port);
    sin.sin_addr.S_un.S_addr=inet_addr(ip.toStdString().c_str());
    addrLen=sizeof(sin);

    sendto(udpSocket,SendData.data(),SendData.size(),0,(sockaddr*)&sin,addrLen);

}

RecvThread::RecvThread()
{
    connect(this,SIGNAL(ToRecv()),this,SLOT(Recv()));
}

RecvThread::~RecvThread()
{

}

void RecvThread::StartRecv()
{
    emit ToRecv();
}

void RecvThread::Recv()
{
    unsigned char buf[2048]={0};
    sockaddr sin;
    int len;
    len=sizeof(sin);
    while (isRun)
    {
        memset(buf,0,2048);
        int recvLen=  recvfrom(*udpSocket,(char*)buf,2048,0,&sin,&len);
        qDebug()<<(char *)buf;
    }
}

调用:udpSocket.SendData(data);即可发送数据。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值