SOCKET UDP recvfrom循环中退出策略选择分析

一般是有一个接受线程,接收线程里有一个循环recvfrom接收数据

 

退出线程时可以采用的方法:

 

1. 在其他线程里调用closesocket(),接收线程里会的recvfrom会返回10004错误,如果继续recvfrom会返回10038错误,通过检测这两个错误来进行退出

 

2. 在其他线程里给接收线程sendto一个特殊包,通过检测这个包判断是否需要退出

 

3. 使用传说中的select模型

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
当客户端以被动接收数据的方式使用 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。 请注意,上述代码仅为示例,仍有待改进和优化,包括错误处理、异常情况处理等。在实际使用时,请根据需求进行适当修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值