免费注册 查看新帖 |

Chinaunix

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

[C] UDP数据报获取系统时间的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-02-15 19:55 |只看该作者 |倒序浏览
《Linux程序设计》第三版,第15章最后关于通过UDP获取系统时间的例子。下面是完整代码:

  1. #include <sys/socket.h>
  2. #include <netinet/in.h>
  3. #include <netdb.h>
  4. #include <stdio.h>
  5. #include <unistd.h>
  6. #include <stdlib.h>

  7. int main(int argc, char *argv[])
  8. {
  9.     char *host;
  10.     int sockfd;
  11.     int len, result;
  12.     struct sockaddr_in address;
  13.     struct hostent *hostinfo;
  14.     struct servent *servinfo;
  15.     char buffer[128];

  16.     if(argc == 1)
  17.     {
  18.         host = "localhost";
  19.     }
  20.     else
  21.     {
  22.         host = argv[1];
  23.     }

  24.     hostinfo = gethostbyname(host);
  25.     if(!hostinfo)
  26.     {
  27.         fprintf(stderr, "no host: %s\n", host);
  28.         exit(1);
  29.     }

  30.     servinfo = getservbyname("daytime", "udp");
  31.     if(!servinfo)
  32.     {
  33.         fprintf(stderr, "no daytime service\n");
  34.         exit(1);
  35.     }
  36.     printf("daytime port is %d\n", ntohs(servinfo->s_port));

  37.     sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  38.     address.sin_family = AF_INET;
  39.     address.sin_port = servinfo->s_port;
  40.     address.sin_addr = *(struct in_addr *)*hostinfo->h_addr_list;
  41.     len = sizeof(address);

  42.     result = sendto(sockfd, buffer, 1, 0, (struct sockaddr *)&address, len);
  43.     result = recvfrom(sockfd, buffer, sizeof(buffer), 0,
  44.                         (struct sockaddr *)&address, &len);
  45.     buffer[result] = '\0';
  46.     printf("read %d bytes: %s\n",result, buffer);

  47.     close(sockfd);

  48.     exit(0);
  49. }
复制代码


按照书上的说明,在/etc/inetd.conf中加入daytime UDP服务,加入下面这行
daytime    dgram    udp    wait    root    internal

但是程序一直阻塞在recvfrom处。。。。为什么会这样?

论坛徽章:
0
2 [报告]
发表于 2010-02-15 20:14 |只看该作者
重启 (x)inetd

# FreeBSD + inetd
/etc/rc.d/inetd restart

# Linux + xinetd
/etc/init.d/xinetd restart

mci4:~$ ./daytime
daytime port is 13
read 26 bytes: 15 FEB 2010 20:14:32 CST

mci4:~$

论坛徽章:
0
3 [报告]
发表于 2010-02-15 20:25 |只看该作者
重启 (x)inetd

# FreeBSD + inetd
/etc/rc.d/inetd restart

# Linux + xinetd
/etc/init.d/xinetd  ...
langue 发表于 2010-02-15 20:14


还是不行啊。。。

下面两种方法都不行
/usr/sbin/inetd restart
killall -HUP inetd

debian系统

论坛徽章:
0
4 [报告]
发表于 2010-02-15 20:42 |只看该作者
于是乎涉及到RP问题?很不巧,我用的就是Debian,和xinetd。

mci4:~$ dpkg --list | grep xinetd
ii  xinetd                          1:2.3.14-7               replacement for inetd with many enhancements
mci4:~$

论坛徽章:
0
5 [报告]
发表于 2010-02-15 20:43 |只看该作者
/usr/sbin/inetd 是否接受 restart 命令,这我不清楚了。
inetd 进程是否接受 SIGHUP,这我也不清楚。
要不你看看 /etc/init.d/ 下面有没有启动/停止的脚本?

论坛徽章:
0
6 [报告]
发表于 2010-02-15 20:57 |只看该作者
debian:/home/parco/test/socket# dpkg --list | grep inetd
ii  openbsd-inetd              0.20050402-6                    The OpenBSD Internet Superserver
ii  update-inetd                 4.27-0.5                             inetd.conf updater

/etc/init.d/下面有这些应用
acct          exim4          module-init-tools      openbsd-inetd          stop-bootlogd-single
acpid        gdm             mountall-bootclean.sh      portmap                    sudo
atd           glibc.sh        mountall.sh                pppd-dns         sysklogd
avahi-daemon     halt                   mountdevsubfs.sh     procps.sh         udev
bootclean            hostname.sh     mountkernfs.sh         rc                     udev-mtab
bootlogd             hwclock.sh         mountnfs-bootclean.sh  rc.local    umountfs
bootmisc.sh         ifupdown           mountnfs.sh             rcS                 umountnfs.sh
checkfs.sh           ifupdown-clean  mtab.sh                    reboot          umountroot
checkroot.sh       keymap.sh         mysql                        rmnologin       urandom
console-screen.sh      killprocs      mysql-ndb                 sendsigs      vmware-tools
cron                    klogd                  mysql-ndb-mgm        single               x11-common
dbus                   libdevmapper1.02       networking       ssh
dirmngr               makedev             nfs-common              stop-bootlogd

debian:/home/parco/test/socket# /etc/init.d/openbsd-inetd restart
Restarting internet superserver: inetdstart-stop-daemon: warning: failed to kill 5584: No such process

但是仍然没有解决问题。。。。。。

论坛徽章:
0
7 [报告]
发表于 2010-02-15 22:21 |只看该作者
谢谢langue斑竹的回复。。。。
daytime TCP服务是可以的,验证的步骤是:

(1) 在/etc/inetd.conf中加入daytime TCP服务
daytime     stream  tcp nowait  root    internal

(2) killall -HUP inetd

(3) ./getdate 后成功提示
daytime port is 13
read 26 bytes: Mon Feb 15 20:16:58 2010

(4.1) 注释掉下面这一行
#daytime     stream  tcp nowait  root    internal

(4.2) killall -HUP inetd

(4.3) ./getdate 后提示
daytime port is 13
oops: getdate: Connection refused

这就说明配置文件里加上的daytime TCP服务起作用了,是吧?

(5) 在/etc/inetd.conf中加入daytime UDP服务
daytime     dgram   udp wait    root    internal

(6) killall -HUP inetd

(7) ./getdate_udp后程序挂起
daytime port is 13

为啥UDP就不行呢????
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP