实现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();
}