Выход из recv l oop после фиксированного времени ожидания - PullRequest
2 голосов
/ 01 февраля 2020

Я использую recv для получения сообщения о сокете с сервера.

size_t b_received = 0;
char headers[2048];
while ((b_received = recv(socket_fd,
                              &headers[pos],
                              sizeof(headers) - pos - 1, 0)) > 0) {
    pos += b_received;
}

Иногда серверу требуется слишком много времени для отправки сообщения, и моя программа застревает и ждет следующего сообщение.

Можно ли как-то закончить это l oop, если сервер не отправит мне следующее сообщение через 5 секунд?

1 Ответ

0 голосов
/ 01 февраля 2020

Вы можете использовать функцию setsockopt , чтобы установить время ожидания для операций приема:

// LINUX
struct timeval tv;
tv.tv_sec = timeout_in_seconds;
tv.tv_usec = 0;
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv);

// WINDOWS
DWORD timeout = timeout_in_seconds * 1000;
setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof timeout);

// MAC OS X (identical to Linux)
struct timeval tv;
tv.tv_sec = timeout_in_seconds;
tv.tv_usec = 0;
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv);

Попробуйте остановить сокет:

#include <sys/socket.h>

int shutdown(int socket, int how);

Дополнительная информация здесь

...