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