繁体   English   中英

C ++ recvfrom超时

[英]C++ recvfrom timeout

我需要实现以下行为:服务器启动时,应使用广播检查现有服务器。 然后它等待答案。

但是,如何设置等待超时时间?

int optval = 1;
char buff[BUFF_SIZE];
SOCKADDR_IN addr;
int length = sizeof(addr);

if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char*)&optval, sizeof(optval)) == SOCKET_ERROR) throw(errors::SETSOCKOPT);

addr->sin_family = AF_INET;
addr->sin_port = htons(this->serverPort);
addr->sin_addr.s_addr = INADDR_ANY;
sendto(s, this->serverName.c_str(), this->serverName.length() + 1, NULL, (SOCKADDR*)&addr, sizeof(addr));

memset(&addr, NULL, sizeof(addr));

recvfrom(s, buff, BUFF_SIZE, NULL, (SOCKADDR*)&addr, &length);

设置与读取超时setsockopt()SO_RCVTIMEO ,并处理EAGAIN/EWOULDBLOCK如果超时被触发时发生。

常见的方法是使用select()poll()来等待一组文件描述符上的事件。 这些功能还允许您指定超时。 在您的情况下,在recvfrom()调用之前添加以下内容:

struct pollfd pfd = {.fd = s, .events = POLLIN};
poll(&pfd, 1, 1000);

这将等待1000毫秒。 当数据包到达套接字s ,或1秒钟后(以先到者为准),此方法将退出。 您可以检查poll()的返回值以查看它是否由于数据包或超时而返回。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM