在固定超时后退出 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
我正在使用 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