Socket C - setsockopt timeout 在关闭前做一些事情
Socket C - setsockopt timeout do some things before closing
我使用带有 SO_RCVTIMEO 选项的 setsockopt 在我的套接字接收函数上设置超时。
它可以工作,但是当超过时间时它会立即关闭套接字。我想在关闭前发消息,可以吗?
(我的程序必须在 Windows 和 Linux 上运行)
我认为实现它的合理方法是使用 select(3) 和超时。
这是一个例子:
https://smnd.sk/anino/programming/c/unix_examples/poll.html
您不只是使用 recv,而是使用带有超时参数的 select()。
fd_set rfd;
FD_ZERO(&rfd);
// sock is your socket
FD_SET(sock, &rfd);
while (1)
{
timeval tv = { 1/*seconds*/, 0 /*ms*/ };
int result = select(sock+1, &rfd, 0, 0, &tv);
if (result == EINTR)
{
// timeout, send stuff and close(sock)
}
else if (result > 0)
{
if (!FD_ISSET(sock, &rfd))
{
recv(sock, ..);
}
}
}
我找到了一个方法:
套接字在关闭前执行 recv(),所以我检查套接字是否收到“”,然后我可以发送消息。之后关闭套接字。
我使用带有 SO_RCVTIMEO 选项的 setsockopt 在我的套接字接收函数上设置超时。 它可以工作,但是当超过时间时它会立即关闭套接字。我想在关闭前发消息,可以吗?
(我的程序必须在 Windows 和 Linux 上运行)
我认为实现它的合理方法是使用 select(3) 和超时。 这是一个例子: https://smnd.sk/anino/programming/c/unix_examples/poll.html 您不只是使用 recv,而是使用带有超时参数的 select()。
fd_set rfd;
FD_ZERO(&rfd);
// sock is your socket
FD_SET(sock, &rfd);
while (1)
{
timeval tv = { 1/*seconds*/, 0 /*ms*/ };
int result = select(sock+1, &rfd, 0, 0, &tv);
if (result == EINTR)
{
// timeout, send stuff and close(sock)
}
else if (result > 0)
{
if (!FD_ISSET(sock, &rfd))
{
recv(sock, ..);
}
}
}
我找到了一个方法: 套接字在关闭前执行 recv(),所以我检查套接字是否收到“”,然后我可以发送消息。之后关闭套接字。