Tag: 阻塞

使用Unix和C / C ++帮助阻止套接字

我正在试图弄清楚什么阻碍了我的程序。 我正在运行使用POSIX线程的服务器。 我必须为我的计算机编程实验室。 main函数侦听新连接。 一旦接受连接,它就会通过将FD传递给线程来创建新线程。 我能够使用多个telnet /客户端连接成功连接到服务器。 我可以成功地将数据发送到服务器一次,但如果我再次尝试发送,服务器将不会执行任何操作。 部分主要function int active_thread = 0; //The Running loop while(running) { if(active_thread > NUMBTHREADS) { printf(“Unable to accept client connection! Threads are all used up”); running = false; } else { if(FD_ISSET(sockfd, &readfds)) { if((bindfd[active_thread] = accept(sockfd, (struct sockaddr *) &client_addr, &client_sock_size)) == -1) { fprintf(stderr, “Unable to […]

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 ( […]

如何在SIGINT处理程序中清理本地数据

我需要在SIGINT处理程序中执行清理函数,但我无法将本地数据传递给它。 这是一个例子: int main(int argc, char *argv[]) { struct database *db = db_cursor(); sockfd_t master_socket = init_server(); signal(SIGINT, sigint_handler); while (1) { // accepting connections } } void sigint_handler(int s) { destroy_db(db); shutdown(master_socket, SHUT_RDWR); close(master_socket); exit(EXIT_SUCCESS); } 我该如何实现这种行为? 我试过让这个变量是全局的,但我不能在编译时调用这个函数(错误:初始化元素不是编译时常量)。

使用select读取和写入相同的套接字(TCP)

我们正在写一个客户端和服务器(我认为是)非常简单的网络通信。 多个客户端连接到服务器,然后服务器将数据发送回所有其他客户端。 服务器只是位于阻塞select循环中等待流量,当它到来时,将数据发送到其他客户端。 这似乎工作得很好。 问题是客户。 在阅读时,它有时会想要写一次。 但是,我发现如果我使用: rv = select(fdmax + 1, &master_list, NULL, NULL, NULL); 我的代码将阻塞,直到有新数据要读取。 但有时(异步,来自另一个线程)我将在网络通信线程上写入新数据。 所以,我希望我的select定期唤醒,让我检查是否有要写的数据,如: if (select(….) != -1) { if (FD_SET(sockfd, &master_list)) // handle data or disconnect else // look for data to write and write() / send() those. } 我尝试将选择设置为轮询模式(或荒谬的短暂超时): // master list contains the sockfd from the getaddrinfo/socket/connect […]