сокеты — C ++ recvfoutout

Мне нужно реализовать следующее поведение: когда сервер запускается, он должен проверять существующие серверы, используя широковещательную рассылку. Тогда он ждет ответа.

Но как установить любое время ожидания?

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);

0

Решение

Установите время чтения с помощью setsockopt() а также SO_RCVTIMEOи обрабатывать EAGAIN/EWOULDBLOCK что происходит, если тайм-аут срабатывает.

1

Другие решения

Обычный способ заключается в использовании select() или же poll() ждать события на множестве файловых дескрипторов. Эти функции также позволяют указать время ожидания. В вашем случае добавьте следующее перед recvfrom() вызов:

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

Это будет ждать 1000 миллисекунд. Это завершится, когда пакет прибыл на сокет sили через 1 секунду, в зависимости от того, что наступит раньше. Вы можете проверить возвращаемое значение poll() чтобы увидеть, вернулся ли он из-за пакета или из-за таймаута.

0

По вопросам рекламы [email protected]