初始化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);即可发送数据。