Linux C my

今天看linux C 编程实战的my_server例子时,敲到这段代码,对其父子进程关闭socket 进行close调用产生疑问

如图中标注的三个close socket,思考子进程通信结束 关闭自己的通信socket:conn_fd可以理解,但将sock_fd,服务器的监听socket也关闭就不知怎么回事了。而且父进程执行close(conn_fd)将子进程的通信socket关闭,这样不久让子进程无法和客户端soket通信了吗? 但是程序正常运行。重新查资料发现是自己对子进程资源的复制和close函数,还有文件描述符的理解不到位

 

首先,socket是一种特殊的数据传输IO,也是一种文件描述符

 

 

while(1) {
        conn_fd = accept(sock_fd, (struct sockaddr *)&cli_addr, &cli_len);
        if (conn_fd < 0) {
            my_err("accept", __LINE__);
        }
        printf("accept a new client, ip:%s\n", inet_ntoa(cli_addr.sin_addr));
        if ((pid = fork()) == 0) {
            while(1) {
                if ((ret = recv(conn_fd, recv_buf, sizeof(recv_buf), 0)) < 0) {
                    perror("recv");
                    exit(1);
                }
                recv_buf[ret-1] = \0;
                if (flag_recv == USERNAME) {
                    name_num = find_name(recv_buf);
                    switch(name_num) {
                        case -1:
                            send_data(conn_fd, "n\n");
                            break;
                        case -2:
                            exit(1);
                            break;
                        default:
                            send_data(conn_fd, "y\n");
                            flag_recv = PASSWORD;
                            break;
                    }
                }
                else if (flag_recv == PASSWORD) {
                    if (strcmp(users[name_num].password, recv_buf) == 0) {
                        send_data(conn_fd, "y\n");
                        send_data(conn_fd, "welcome login my tcp server\n");
                        printf("%s login\n", users[name_num].username);
                        flag_recv = MESSAGE;
                    }
                    else {
                        send_data(conn_fd, "n\n");
                    }
                }
                else if (flag_recv == MESSAGE) {
                    if (strcmp("quit", recv_buf) == 0) {
                        break;
                    }
                    printf("message from %s: %s\n", users[name_num].username, recv_buf);
                }
            }
            close(sock_fd);
            close(conn_fd);
            printf("child exit!\n");
            exit(0);
        }else {
            close(conn_fd); }

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。