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);
常用的方法是使用select()
或poll()
来等待一组文件描述符上的事件。这些函数还允许您指定超时。在您的情况下,在 recvfrom()
调用之前添加以下内容:
struct pollfd pfd = {.fd = s, .events = POLLIN};
poll(&pfd, 1, 1000);
这将等待 1000 毫秒。这将在数据包到达套接字 s
或 1 秒后退出,以先到者为准。您可以检查 poll()
的 return 值,看看它 return 是因为数据包还是超时。
使用 setsockopt()
和 SO_RCVTIMEO
设置读取超时,并处理触发超时时发生的 EAGAIN/EWOULDBLOCK
。
我需要实现以下行为:当服务器启动时,它应该使用广播检查现有服务器。然后它等待回答。
但是,如何设置等待超时?
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);
常用的方法是使用select()
或poll()
来等待一组文件描述符上的事件。这些函数还允许您指定超时。在您的情况下,在 recvfrom()
调用之前添加以下内容:
struct pollfd pfd = {.fd = s, .events = POLLIN};
poll(&pfd, 1, 1000);
这将等待 1000 毫秒。这将在数据包到达套接字 s
或 1 秒后退出,以先到者为准。您可以检查 poll()
的 return 值,看看它 return 是因为数据包还是超时。
使用 setsockopt()
和 SO_RCVTIMEO
设置读取超时,并处理触发超时时发生的 EAGAIN/EWOULDBLOCK
。