【问题标题】:what address to use in inet_pton?在inet_pton 中使用什么地址?
【发布时间】:2026-01-22 20:35:01
【问题描述】:

我是 IP/TCP 的初学者,但是阅读Addison Wesley : UNIX Network Programming Volume 1,我有以下代码:

#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: main <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);
    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;
        if (fputs(recvline, stdout) == EOF)
        {
            err_sys("fputs error");
        }
    }
    exit(0);
}

现在从书中,他们将其运行为

solaris % a.out 206.168.112.96

如果我查找我的地址:

user@Host:~/Desktop/bin/1$ ifconfig
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 15419  bytes 1627065 (1.6 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 15419  bytes 1627065 (1.6 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlp2s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.5  netmask 255.255.255.0  broadcast 10.0.0.255
        inet6 2a00:1028:8d1b:f32a:8ddb:cc89:8404:e9dc  prefixlen 64  scopeid 0x0<global>
        inet6 2a00:1028:8d1b:f32a:c84a:2566:28f5:81e1  prefixlen 64  scopeid 0x0<global>
        inet6 fe80::2954:989:452f:c90f  prefixlen 64  scopeid 0x20<link>
        ether 5c:3a:45:55:ae:b5  txqueuelen 1000  (Ethernet)
        RX packets 1095391  bytes 1521941184 (1.5 GB)
        RX errors 0  dropped 1  overruns 0  frame 0
        TX packets 392567  bytes 53028207 (53.0 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

我假设这是我的 IPv4 地址10.0.0.5,所以如果我尝试运行上面的代码:

./a.out 10.0.0.5
connect error: Connection refused

我的连接被拒绝。我使用了正确的地址吗?,从书中,他们使用了以 206 开头的东西......我应该使用哪个地址将被 inet_pton 解析?

【问题讨论】:

  • 问题不在于 IP 本身。这是因为您尝试连接的 IP 未在端口 13 上运行侦听 daytime server。您无法连接到不存在的服务器。这就是“连接被拒绝”的原因之一 - 连接到达目标 IP,但目标端口未在该 IP 处打开。
  • 如果我用nc 建立一个,即使在建立连接后(sudo nc -v -l -s127.0.0.1 -p13),netcat 服务器仍在等待某些东西。但我从来没有把日期打印出来。如何停止监听并从客户端(c文件)发送数据打印?

标签: c sockets ubuntu ip


【解决方案1】:

首先给自己一些与本地联系的东西。例如,在单独的终端中运行程序之前,尝试nc -v -l 13 在端口 13 上运行 netcat 侦听。抱歉,我没有足够的代表来发表评论。

【讨论】:

  • 从netcat列出到localhsot(127.0.0.1)后,建立连接。但是日期时间甚至没有打印出来。我得到了这个:Connection received on localhost 51188,然后等待。如何结束列表并从客户端(c 可执行文件)获取输出?
  • netcat 的使用只是为了创建一个临时的示例服务器来测试套接字。您需要通过 inetd 或 xinetd 启用日间服务器以接收日期和时间响应
  • @milanHrabos:pivoc 绝对正确:"Give yourself something to connect with"。 “nc -v -l 13”是一个很好的建议。它会让测试客户端“连接”......但它不会给“时间”。 “time.nist.gov”(132.163.96.4)是另一种选择:tf.nist.gov/tf-cgi/servers.cgi。请务必“投票”和“接受” pivoc 的回复。
【解决方案2】:

使用您的本地计算机 IP 地址。 或使用默认本地主机 IP 地址:127.0。 0.1。 这个地址 127.0. 0.1 是 IPv4 的标准地址。

【讨论】:

  • 或 ::1 用于 IPv6 示例。