C++ udp 通信

UDPclient.cpp

#include<WINSOCK2.H>
#include<iostream>
#pragma comment(lib,"WS2_32.lib")
using namespace std;
int main()
{
WSADATA wsaData;//初始化
SOCKET SendSocket;
sockaddr_in RecvAddr;//服务器地址
int Port=4000;//服务器监听地址
char SendBuf[1024];//发送数据的缓冲区
int BufLen=1024;//缓冲区大小
//初始化Socket
WSAStartup(MAKEWORD(2,2),&wsaData);
//创建Socket对象
SendSocket=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
//设置服务器地址
RecvAddr.sin_family=AF_INET;
RecvAddr.sin_port=htons(Port);
RecvAddr.sin_addr.s_addr=inet_addr("192.168.137.1");
//向服务器发送数据报
printf("Sending a datagram to the receiver...\n");
sendto(SendSocket,SendBuf,BufLen,0,(SOCKADDR *)&RecvAddr,sizeof(RecvAddr));
//发送完成,关闭Socket
printf("finished sending,close socket.\n");
closesocket(SendSocket);
printf("Exting.\n");
WSACleanup();
return 0;
}

 

UDPserver.cpp

#include<WINSOCK2.H>
#include<iostream>
#pragma comment(lib,"WS2_32.lib")
using namespace std;
int main()
{
WSADATA wsaData;//初始化
SOCKET RecvSocket;
sockaddr_in RecvAddr;//服务器地址
int Port=4000;//服务器监听地址
char RecvBuf[1024];//发送数据的缓冲区
int BufLen=1024;//缓冲区大小
sockaddr_in SenderAddr;
int SenderAddrSize=sizeof(SenderAddr);
//初始化Socket
WSAStartup(MAKEWORD(2,2),&wsaData);
//创建接收数据报的socket
RecvSocket=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
//将socket与制定端口和0.0.0.0绑定
RecvAddr.sin_family=AF_INET;
RecvAddr.sin_port=htons(Port);
RecvAddr.sin_addr.s_addr=htonl(INADDR_ANY);
bind(RecvSocket,(SOCKADDR *)&RecvAddr,sizeof(RecvAddr));
//调用Recvfrom函数在绑定的socket上接收数据
printf("receiving datagrams...\n");
recvfrom(RecvSocket,RecvBuf,BufLen,0,(SOCKADDR *)&SenderAddr,&SenderAddrSize);
//关闭socket,结束接收数据
printf("finished receiving,closing socket..\n");
closesocket(RecvSocket);
//释放资源,退出
printf("Exiting.\n");
WSACleanup();
return 0;
}

转自https://www.cnblogs.com/lyggqm/p/6546925.html

 

### Qt 和 C++ 实现 UDP 通信的示例代码 以下是基于提供的引用以及相关知识整理的一份完整的 Qt 和 C++ 实现 UDP 通信的教程和示例代码。 #### 示例代码说明 下面是一个简单的客户端和服务端的 UDP 通信示例,展示了如何通过 `QUdpSocket` 进行数据收发操作。服务端绑定到指定地址并监听传入的数据报;客户端向目标地址发送消息,并等待响应。 --- #### 客户端实现 (`client.cpp`) ```cpp #include <QCoreApplication> #include <QUdpSocket> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); QUdpSocket udpSocket; QByteArray data = "Hello from client!"; // 发送数据给服务器 bool sent = udpSocket.writeDatagram(data, QHostAddress("127.0.0.1"), 7755); if (!sent) { qDebug() << "Failed to send datagram."; } // 接收来自服务器的回复 while (true) { if (udpSocket.hasPendingDatagrams()) { QNetworkDatagram datagram = udpSocket.receiveDatagram(); qDebug() << "Received:" << datagram.data(); break; } } return app.exec(); } ``` 此部分实现了客户端的功能,它会尝试连接至本地主机上的特定端口(此处为 7755),并向其发送一条字符串消息[^3]。 --- #### 服务端实现 (`server.cpp`) ```cpp #include <QCoreApplication> #include <QUdpSocket> #include <QDebug> class UdpServer : public QObject { Q_OBJECT public: explicit UdpServer(QObject *parent = nullptr) : QObject(parent), udpSocket(new QUdpSocket(this)) { // 绑定到本机 IP 地址及端口号 if (!udpSocket->bind(QHostAddress::LocalHost, 7755)) { qCritical() << "Unable to bind!"; exit(-1); } connect(udpSocket, &QUdpSocket::readyRead, this, &UdpServer::processPendingDatagrams); } private slots: void processPendingDatagrams() { while (udpSocket->hasPendingDatagrams()) { QNetworkDatagram datagram = udpSocket->receiveDatagram(); qDebug() << "Message received:" << datagram.data(); // 将接收到的消息回显给客户端 udpSocket->writeDatagram(datagram.data(), datagram.senderAddress(), datagram.senderPort()); } } private: QUdpSocket *udpSocket; }; int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); UdpServer server; return app.exec(); } #include "main.moc" ``` 这段程序创建了一个继承自 `QObject` 的类来管理所有的 UDP 数据包读取逻辑。当检测到来自外部设备的新数据时触发槽函数执行进一步处理动作[^4]。 --- ### 关键知识点解析 1. **QUdpSocket 类的作用** - 提供了用于发送和接收 UDP 数据报的方法。 - 不像 TCP 那样需要建立可靠的连接,在某些场景下可以提供更低延迟的服务[^3]。 2. **基本方法介绍** - `bind()` 方法用来关联某个具体的网络接口及其对应的端口号以便于接受外界请求。 - `writeDatagram()` 可以直接把字节数组形式的内容传递出去而无需关心底层细节。 - 当有新的可用数据到达之后就会发出信号通知调用者去获取这些新内容[`^4`]。 3. **错误处理机制** 虽然相比起流式的协议来说较为简化但仍需注意可能出现的各种异常情况比如内存不足等问题[^3]. --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值