请使用C++ 写一个 UDP 的socket客户端,要求被动接收数据
时间: 2024-04-11 08:27:40 浏览: 123
当客户端以被动接收数据的方式使用 UDP Socket 时,需要使用`recvfrom()`函数来接收数据。以下是一个简单的示例代码,展示了如何在 C++ 中编写一个 UDP Socket 客户端:
```cpp
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define PORT 8888
#define BUFFER_SIZE 1024
int main() {
int sockfd;
char buffer[BUFFER_SIZE];
struct sockaddr_in serverAddress, clientAddress;
socklen_t clientLength;
// 创建UDP Socket
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
std::cerr << "Failed to create socket." << std::endl;
return 1;
}
// 设置服务器地址和端口
serverAddress.sin_family = AF_INET;
serverAddress.sin_port = htons(PORT);
serverAddress.sin_addr.s_addr = INADDR_ANY;
// 绑定客户端地址和端口
if (bind(sockfd, (struct sockaddr*)&serverAddress, sizeof(serverAddress)) < 0) {
std::cerr << "Failed to bind." << std::endl;
return 1;
}
// 接收数据
while (true) {
memset(buffer, 0, BUFFER_SIZE);
// 阻塞接收数据
ssize_t dataSize = recvfrom(sockfd, buffer, BUFFER_SIZE - 1, 0,
(struct sockaddr*)&clientAddress, &clientLength);
if (dataSize < 0) {
std::cerr << "Failed to receive data." << std::endl;
break;
}
std::cout << "Received data: " << buffer << std::endl;
// 如果接收到 "quit" 则退出循环
if (strcmp(buffer, "quit") == 0) {
std::cout << "Exiting..." << std::endl;
break;
}
}
// 关闭Socket
close(sockfd);
return 0;
}
```
这个示例代码中,使用了`socket()`函数创建了一个 UDP Socket,并使用`bind()`函数将其与客户端地址和端口绑定。然后通过循环使用`recvfrom()`函数阻塞接收数据,并将接收到的数据打印出来。如果接收到 "quit" 则退出循环。最后使用`close()`函数关闭 Socket。
请注意,上述代码仅为示例,仍有待改进和优化,包括错误处理、异常情况处理等。在实际使用时,请根据需求进行适当修改和完善。
阅读全文