在固定超时后退出 recv 循环

Exiting the recv loop after a fixed timeout

我正在使用 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;
}

有时,服务器发送消息的时间太长,我的程序卡住了,正在等待下一条消息。

如果服务器在 5 秒后没有向我发送下一条消息,有没有办法让我结束这个循环?

您可以使用 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);

更多信息here