#include <iostream>
#include <string>
#include <thread>
#include <chrono>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <fcntl.h>
#include <cstring>
// UDP监听函数
void UDPListen(const std::string& targetIP, int targetPort) {
// 创建UDP套接字
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd == -1) {
std::cout << "Failed to create socket." << std::endl;
return;
}
// 设置套接字为非阻塞模式
int flags = fcntl(sockfd, F_GETFL, 0);
fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
// 设置目标地址和端口
sockaddr_in targetAddr;
std::memset(&targetAddr, 0, sizeof(targetAddr));
targetAddr.sin_family = AF_INET;
targetAddr.sin_port = htons(targetPort);
if (inet_pton(AF_INET, targetIP.c_str(), &(targetAddr.sin_addr)) <= 0) {
std::cout << "Invalid target IP address." << std::endl;
close(sockfd);
return;
}
// 绑定本地地址和端口
sockaddr_in localAddr;
std::memset(&localAddr, 0, sizeof(localAddr));
localAddr.sin_family = AF_INET;
localAddr.sin_port = htons(targetPort); // 可以根据实际需求选择本地端口
localAddr.sin_addr.s_addr = INADDR_ANY;
if (bind(sockfd, (const sockaddr*)&localAddr, sizeof(localAddr)) == -1) {
std::cout << "Failed to bind socket." << std::endl;
close(sockfd);
return;
}
// 监听和接收数据
char buffer[1024];
while (true) {
std::memset(buffer, 0, sizeof(buffer));
// 接收数据
ssize_t bytesRead = recvfrom(sockfd, buffer, sizeof(buffer) - 1, 0, NULL, NULL);
if (bytesRead > 0) {
// 打印接收到的数据
std::cout << "Received: " << buffer << std::endl;
}
// 检测网络连接状态
int error = 0;
socklen_t len = sizeof(error);
if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len) != 0) {
std::cout << "Failed to get socket option." << std::endl;
close(sockfd);
return;
}
// 检查网络连接状态
bool networkConnected = (error == 0);
// 如果网络断开,等待网络恢复
while (!networkConnected) {
// 打印等待网络恢复的提示信息
std::cout << "Network disconnected. Waiting for network recovery..." << std::endl;
// 等待一段时间后重新检测网络连接状态
std::this_thread::sleep_for(std::chrono::seconds(5));
// 检测网络连接状态
if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len) != 0) {
std::cout << "Failed to get socket option." << std::endl;
close(sockfd);
return;
}
// 检查网络连接状态
networkConnected = (error == 0);
}
}
// 关闭套接字
close(sockfd);
}
// 主函数
int main() {
std::string targetIP = "192.168.1.3";
int targetPort = 56100;
// 创建监听线程
std::thread listenThread(UDPListen, targetIP, targetPort);
// 等待监听线程结束(这个例子中,永远不会结束)
listenThread.join();
return 0;
}