gpt4 book ai didi

c++ - 使用 libpqxx 查看网络连接是否丢失

转载 作者:太空狗 更新时间:2023-10-29 21:20:58 27 4
gpt4 key购买 nike

我正在编写一个 C++ 客户端程序,通过互联网查询 postgreSQL 数据库。我想在等待答案时处理事件,发生网络连接问题,因此客户端无法从数据库服务器接收任何消息。但是当我手动关闭互联网连接时,即使我稍后再次打开连接,程序仍然处于空闲状态。有没有办法捕获此事件或至少在客户端设置超时,以便它停止等待响应之后的响应?

最佳答案

您可以使用 timeval 结构并调用 setsockopt 为任何套接字操作(不同于连接)设置超时。

struct timeval timeout;      
timeout.tv_sec = 10;
timeout.tv_usec = 0;

if ( setsockopt (sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout,
sizeof(timeout)) < 0)
error( "setsockopt failed\n");

SO_RCVTIMEO选项用于指示输入操作。

您还可以使用超时参数对非阻塞套接字进行select调用:

const int timeout_msecs = 5000;
struct timeval tval;
tval.tv_usec = 1000 * (timeout_msecs % 1000);
tval.tv_sec = timeout_msecs / 1000;

fd_set waitSet;
FD_ZERO( &waitSet );
FD_SET( fd, &waitSet );

int ret;
ret = select( fd + 1, &waitSet, NULL, NULL, &tval );

最后,Richard Stevens 在他的“Unix Networking Programming”中展示的技术涉及系统中断的使用:

static void
sig_alrm(int signo)
{
return; /* just interrupt the recvfrom() */
}

void
dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)
{
int n;
char sendline[MAXLINE], recvline[MAXLINE + 1];

Signal(SIGALRM, sig_alrm);

while (Fgets(sendline, MAXLINE, fp) != NULL) {

Sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);

alarm(5);
// call recvfrom with 5 seconds timeout
if ( (n = recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL)) < 0) {
if (errno == EINTR)
fprintf(stderr, "socket timeout\n");
else
err_sys("recvfrom error");
} else {
alarm(0);
recvline[n] = 0; /* null terminate */
Fputs(recvline, stdout);
}
}
}

关于c++ - 使用 libpqxx 查看网络连接是否丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23492024/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com