【问题标题】:I run UNIX Network Programming Volume 1(3rd) but how to config the networking environment?我运行 UNIX Network Programming Volume 1(3rd) 但如何配置网络环境?
【发布时间】:2013-12-31 01:49:21
【问题描述】:

我只是运行“1.2 A Simple Daytime Client”示例。但是在ubuntu下,如何配置网络环境呢?

示例用法是“solaris % a.out 206.168.112.96”,这里我应该如何更改 IP。我通过 LAN 连接到 Internet。 ifconfig 显示的我的 ip 是

inet address: 192.168.0.109,但是在这里当我输入a.out 192.168.0.109 时,它给出的信息是“连接错误:连接被拒绝”,我该怎么办?

附上此示例代码:

介绍/daytimetcpcli.c

  #include  "unp.h"

  int
  main(int argc, char **argv)
  {
      int     sockfd, n;
      char    recvline[MAXLINE + 1];
      struct sockaddr_in servaddr;

      if (argc != 2)
          err_quit("usage: a.out <IPaddress>");

     if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
         err_sys("socket error");

     bzero(&servaddr, sizeof(servaddr));
     servaddr.sin_family = AF_INET;
     servaddr.sin_port = htons(13);  /* daytime server */
     if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
         err_quit("inet_pton error for %s", argv[1]);

     if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < 0)
         err_sys("connect error");

     while ( (n = read(sockfd, recvline, MAXLINE)) > 0) {
         recvline[n] = 0;        /* null terminate */
         if (fputs(recvline, stdout) == EOF)
             err_sys("fputs error");
     }
     if (n < 0)
         err_sys("read error");

     exit(0);
 }

任何人都可以提供任何建议,我是网络编程的新手。

我只是按照此处提供的一个答案运行:

root@ubuntu:/home/jack/dev/practice# ./daytimetcpcli 192.168.0.109
connect error: Connection refused
root@ubuntu:/home/jack/dev/practice# 

它仍然给出连接错误信息:

我使用 netstat 来查看信息。

  jack@ubuntu:~$ sudo netstat -tlp

  activate Internet connection (just server)
  Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
  tcp        0      0 localhost:5038          *:*                     LISTEN      1625/asterisk   
  tcp        0      0 *:cisco-sccp            *:*                     LISTEN      1625/asterisk   
  tcp        0      0 *:http                  *:*                     LISTEN      1679/apache2    
  tcp        0      0 localhost:domain        *:*                     LISTEN      1405/dnsmasq    
  tcp        0      0 localhost:ipp           *:*                     LISTEN      933/cupsd       
  tcp        0      0 localhost:postgresql    *:*                     LISTEN      1076/postgres   
  tcp        0      0 localhost:5946          *:*                     LISTEN      983/teamviewerd 
  tcp        0      0 *:sip                   *:*                     LISTEN      1625/asterisk   
  tcp6       0      0 ip6-localhost:ipp       [::]:*                  LISTEN      933/cupsd       

【问题讨论】:

  • 仅供参考,除非您确实需要引用特定行,否则不要在发布的代码中添加行号。即使这样,评论和箭头也应该可以解决问题。这些数字使任何人都不太可能尝试您的代码。 (不是这篇文章的问题,而是未来的问题。)
  • 你在客户端之前启动了服务器吗?
  • 检查是否可以使用netcat连接到它。如果您的连接也被拒绝,则说明您的日间服务器没有运行,或者您的防火墙阻止了它。
  • 这个示例代码是在大多数主机上运行“白天”服务器是标准做法时编写的。所以它期望该服务器正在运行。但是现在很少这样做了。所以你可能需要安装 linux 的 netkitnetkit-timed 才能让它工作。
  • 与其运行您自己的白天服务器,这里有一个公共服务器列表,您可以将您的客户指向:tf.nist.gov/tf-cgi/servers.cgi

标签: c linux networking


【解决方案1】:

您应该首先在本地运行daytimetcpsrv,它作为本地时间服务器提供。然后你可以运行daytimetcpcli 127.0.0.1 来获取当前时间。

【讨论】:

    【解决方案2】:

    当前版本的ubuntu默认没有安装daytime服务器,但是很容易做到。

    • 如果尚未安装xinetd,请使用sudo apt-get install xinetd 安装它
    • 编辑/etc/xinetd.d/daytimedisable = yes 更改为disable = no

    .

    service daytime
    {
        disable         = no
        type            = INTERNAL
        id              = daytime-stream
        socket_type     = stream
        protocol        = tcp
        user            = root
        wait            = no
    }
    
    • 键入sudo service xinetd reload 使其读取更改的配置文件
    • 键入netstat -a -t | grep daytime 以验证白天服务器是否正在运行,然后再次尝试运行您的客户端程序

    【讨论】:

    • OP 使用的代码带有日间服务器。除了客户端,他只需要编译运行即可。
    • 我已经在我的 ubuntu 上安装了 xinetd,还将配置文件更改为禁用选项为 no。输入你说的后一个 cmd。但是当搜索白天服务器时,仍然没有结果。我认为我可能不正确的“服务 xinetd”步骤。我键入服务 xined。它显示“jack@ubuntu:~$ service xinetd Usage: /etc/init.d/xinetd COMMAND”信息。我应该怎么做?我可以不启动白天服务器吗?
    • 请输入service xinetd restart,以防xinetd的安装没有启动它。 service xinetd 总是会报错,因为service 命令至少需要两个参数,服务名称和要执行的操作。
    • 谢谢,马克。我只是使用服务 xinetd start 但得到一些这样的错误信息,似乎 xinetd 正在运行。 "jack@ubuntu:~/dev/practice$ service xinetd start start: 拒绝发送消息,1 个匹配规则;type="method_call", sender=":1.83" (uid=1000 pid=14392 comm="start xinetd") interface="com.ubuntu.Upstart0_6.Job" member="Start" error name="(unset)" requested_reply="0" destination="com.ubuntu.Upstart" (uid=0 pid=1 comm="/sbin /init") jack@ubuntu:~/dev/practice$
    • 对不起,我忘了说您需要成为超级用户才能启动或停止服务。所以命令是sudo service xinetd restart
    猜你喜欢
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    • 2020-08-11
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多