C++如何退出while循环recvfrom()
C++ How to exit out of a while loop recvfrom()
我正试图创建一个UDP广播程序来检查本地游戏服务器,但我在接收端遇到了一些问题。由于服务器的数量一直是未知的,你必须有一个循环,只有当你停止它时才会退出
while(1) // start a while loop
{
if(recvfrom(sd,buff,BUFFSZ,0,(struct sockaddr *)&peer,&psz) < 0) // recvfrom() function call
{
cout << red << "Fatal: Failed to receive data" << white << endl;
return;
}
else
{
cout << green << "Found Server :: " << white;
cout << yellow << inet_ntoa(peer.sin_addr), htons(peer.sin_port);
cout << endl;
}
}
我希望运行这个recvfrom()函数,直到我按下Ctrl+C。我已经尝试过设置处理程序等(根据相关问题),但它们对我来说要么太复杂了,要么是一个简单的函数,只是作为演示退出程序。这是我的问题:该程序一直挂在recvfrom上,直到它接收到连接(我猜),所以,它从来没有机会专门等待输入。我该如何设置一个能很好地实现这一点的活动?
谢谢!
在CTRL-C处理程序中,设置一个标志,并将该标志用作while
循环中的条件。
哦,如果你不在POSIX系统上,系统调用可能会被信号中断,你可能想让套接字不阻塞,并使用例如select
(有一个小的超时)来轮询数据。
Windows在这样的方案中有几个问题。主要问题是函数调用不能被CTRL-C处理程序中断。相反,您必须轮询循环中是否有要接收的内容,同时还要检查"退出循环"标志。
可以这样做:
bool ExitRecvLoop = false;
BOOL CtrlHandler(DWORD type)
{
if (type == CTRL_C_EVENT)
{
ExitRecvLoop = true;
return TRUE;
}
return FALSE; // Call next handler
}
// ...
SetConsoleCtrlHandler((PHANDLER_ROUTINE) CtrlHandler, TRUE);
while (!ExitRecvLoop)
{
fd_set rs;
FD_ZERO(&rs);
FD_SET(sd, &rs);
timeval timeout = { 0, 1000 }; // One millisecond
if (select(sd + 1, &rs, NULL, NULL, &timeout) < 0)
{
// Handle error
}
else
{
if (FD_ISSET(sd, &rs))
{
// Data to receive, call `recvfrom`
}
}
}
您可能必须使套接字不阻塞才能工作(请参阅ioctlsocket
函数了解如何操作)。
线程关闭recvFrom()循环,以便主线程可以等待用户输入。当用户请求停止时,从主线程关闭fd,recvFrom()将立即返回并返回一个错误,因此允许您的recv弗洛()线程退出。
相关文章:
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- while循环中while循环的时间复杂度是多少
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 擦除while循环中迭代的元素
- 为什么我不能在 while 循环中创建线程?
- 退出简单while循环时出现问题
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 即使没有满足他们的条件,我也无法通过一些 do-while 循环
- 嵌套While循环不起作用(C++问题)
- 如何通过替换顺序代码的while循环来添加OpenMP for循环
- 使用 GMP 的 while 循环出现问题
- 程序以使用 C++ 中的 while 循环查找一组数字的最小值
- 为什么在 while 循环中返回表达式不起作用
- 如何使用 do while 循环确定最高值和最低值
- 如何读取单个字符并在输入两个字符序列时输出? 使用 while 循环和C++
- 用于在 C++ 中使用 while 循环查找下一个素数的简单函数
- OpenCV QT,显示视频的帧(不使用while循环)
- 在 while 循环中使用 pow() 函数 C++
- C++ 制作/命名不初始化的向量(在 while 循环中)
- std::getline没有在while循环中重新请求用户输入