免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1592 | 回复: 0
打印 上一主题 下一主题

一个伯克利ftpd源码的问题(我没看懂)?谢谢 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-09-01 17:18 |只看该作者 |倒序浏览
本帖最后由 xdshting 于 2010-09-01 17:20 编辑
  1.         if (daemon_mode) {
  2.                 int ctl_sock, fd2;
  3.                 struct servent *sv;

  4.                 /*
  5.                  * Detach from parent.
  6.                  */
  7.                 if (daemon(1, 1) < 0) {
  8.                         syslog(LOG_ERR, "failed to become a daemon");
  9.                         exit(1);
  10.                 }
  11.                 (void) signal(SIGCHLD, reapchild);
  12.                 /*
  13.                  * Get port number for ftp/tcp.
  14.                  */
  15.                 sv = getservbyname("ftp", "tcp");
  16.                 if (sv == NULL) {
  17.                         syslog(LOG_ERR, "getservbyname for ftp failed");
  18.                         exit(1);
  19.                 }
  20.                 /*
  21.                  * Open a socket, bind it to the FTP port, and start
  22.                  * listening.
  23.                  */
  24.                 ctl_sock = socket(AF_INET, SOCK_STREAM, 0);
  25.                 if (ctl_sock < 0) {
  26.                         syslog(LOG_ERR, "control socket: %m");
  27.                         exit(1);
  28.                 }
  29.                 if (setsockopt(ctl_sock, SOL_SOCKET, SO_REUSEADDR,
  30.                     (char *)&on, sizeof(on)) < 0)
  31.                         syslog(LOG_ERR, "control setsockopt: %m");;
  32.                 server_addr.sin_family = AF_INET;
  33.                 server_addr.sin_addr.s_addr = INADDR_ANY;
  34.                 server_addr.sin_port = sv->s_port;
  35.                 if (bind(ctl_sock, (struct sockaddr *)&server_addr,
  36.                          sizeof(server_addr))) {
  37.                         syslog(LOG_ERR, "control bind: %m");
  38.                         exit(1);
  39.                 }
  40.                 if (listen(ctl_sock, 32) < 0) {
  41.                         syslog(LOG_ERR, "control listen: %m");
  42.                         exit(1);
  43.                 }
  44.                 /*
  45.                  * Loop forever accepting connection requests and forking off
  46.                  * children to handle them.
  47.                  */
  48.                 while (1) {
  49.                         addrlen = sizeof(his_addr);
  50.                         fd2 = accept(ctl_sock, (struct sockaddr *)&his_addr,
  51.                                     &addrlen);
  52.                         if (fork() == 0) {
  53.                                 /* child */
  54.                                 (void) dup2(fd2, 0);
  55.                                 (void) dup2(fd2, 1);
  56.                                 close(ctl_sock);
  57.                                 break;
  58.                         }
  59.                         close(fd2);
  60.                 }
  61.         } else[color=Red] {
  62.                 addrlen = sizeof(his_addr);
  63.                 if (getpeername(0, (struct sockaddr *)&his_addr,
  64.                                 &addrlen) < 0) {
  65.                         syslog(LOG_ERR, "getpeername (%s): %m", argv[0]);
  66.                         exit(1);
  67.                 }[/color]
  68.         }
复制代码
红色的部分很奇怪(64行),从if。。。else。。。可以看出,只有在deamon模式,才会把描述符0定向到套接口,否则他就是普通的文件描述符啊?
怎么能能对他调用getpeername呢?
更多的源码在
http://www.hackchina.com/r/56502 ... ftpd-_-ftpd.c__html
谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP