簡體   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