Tag: 超时

套接字超时:它有效,但为什么以及如何,主要是select()函数?

这是我现在使用的代码的一部分。 fd_set fdset; struct timeval tv; int flags = fcntl(sockfd, F_GETFL); fcntl(sockfd, F_SETFL, O_NONBLOCK); connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)); FD_ZERO(&fdset); FD_SET(sockfd, &fdset); tv.tv_sec = 3; tv.tv_usec = 0; if (select(sockfd + 1, NULL, &fdset, NULL, &tv) == 1) { int so_error; socklen_t len = sizeof so_error; getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &so_error, &len); if (so_error == 0) { cout […]

C:具有超时的非阻塞套接字:如何检查是否发出了连接请求?

我希望有一台服务器一次连接到一个客户端,在连接到给定客户端时忽略连接请求。 我还希望避免服务器在侦听第一个客户端时被锁定,以便程序可以干净地终止。 显然,套接字可以是非阻塞的: http : //beej.us/guide/bgnet/output/html/singlepage/bgnet.html#blocking 我相应地创建了我的套接字(为清楚起见,删除了错误管理 int sockfd; struct sockaddr_in self; sockfd = socket(AF_INET, SOCK_STREAM, 0)); fcntl(sockfd, F_SETFL, O_NONBLOCK); // making this socket non blocking bzero(&self, sizeof(self)); self.sin_family = AF_INET; self.sin_port = htons(port); self.sin_addr.s_addr = inet_addr(“127.0.0.1”); // allowing connection from localhost only. bind(sockfd, (struct sockaddr*)&self, sizeof(self)); 从那时起,我不确定如何管理超时。 以下代码不起作用,但提供了我想要实现的内容。 int client_found = 0; while ( […]

用于TFTP的C超时实现

我试图在我的TFTP实现中实现超时机制,我正在寻找一些一般的帮助。 我想知道的是如何管理超时情况。 我使用的过早超时机制是信号/报警function,但不知怎的,我陷入了如何处理我的超时,即如果丢失数据包(ack或数据)并且发生超时如何发回以前的数据包或确认服务器。

想要使用g_timeout_add。 必须运行glib主循环?

我正在尝试使用g_timeout_add(timevalue,Func,在Func中传递的值)添加回调以获取某些状态或在timevalue之后打印一些内容。 我无法看到它。 我还要调用主循环吗? 或任何其他类型的function,以使其工作?

c中有刺激性的select()行为

while (xxx) { timeout.tv_sec=TIMEOUT; timeout.tv_usec=0; FD_ZERO(&set); FD_SET(sd,&set); switch (select(FD_SETSIZE,&set,NULL,NULL,&timeout)) xxxxx } 然而,工作正常 FD_ZERO(&set); FD_SET(sd,&set); while (xxx) { timeout.tv_sec=TIMEOUT; timeout.tv_usec=0; switch (select(FD_SETSIZE,&set,NULL,NULL,&timeout)) xxxxx } 没有。 它第一次工作,但下次它运行while循环时,即使sd套接字接收数据,它也会获得超时。 在我看来,每次都必须清空和填充设置是浪费资源。 任何人都有一个很好的解释为什么这是,甚至更好,也许是一个如何避免它的建议?

连接到套接字时似乎无法使超时工作

我正在尝试为connect()提供超时。 我四处搜寻,发现了几篇与此相关的文章。 我编写了我认为应该工作的内容,但不幸的是我没有从getsockopt()报告错误。 但是当我来到write()时,它失败了,错误是107 – ENOTCONN。 几点。 我在Fedora 23上运行.connect()的文档说它应该返回失败的EINPROGRESS错误,因为连接尚未完成但是我遇到了EAGAIN所以我将其添加到我的支票中。 目前我的套接字服务器在listen()调用中将backlog设置为零。 许多调用成功但是那些失败的调用都失败了107 – 我在write()调用中提到的ENOTCONN。 我希望我只是遗漏了一些东西,但到目前为止还无法弄清楚是什么。 int domain_socket_send(const char* socket_name, unsigned char* buffer, unsigned int length, unsigned int timeout) { struct sockaddr_un addr; int fd = -1; int result = 0; // Create socket. fd = socket(AF_UNIX, SOCK_STREAM, 0); if (fd == -1) { result = -1; […]

为getchar()添加超时

我需要在程序中为getchar()添加一个超时函数。 我该怎么办,当我的程序到达指令getchar()时,它只会等待一段时间让用户进行击键,如果用户没有在给定的时间限制内进行击键,程序将“跳过”getchar()? 操作系统不支持conio.h库,因此kbhit不是一个选项。