【发布时间】: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文件)发送数据打印?