inet_pton该用什么地址?TCP/IP新手遇代码连接拒绝问题
解答:连接被拒绝的原因及inet_pton的正确用法
首先给你吃个定心丸:你判断自己的IPv4地址为10.0.0.5是完全正确的——从ifconfig输出的wlp2s0接口信息里,inet 10.0.0.5确实是你的机器在当前局域网内的有效IPv4地址。
为什么运行./a.out 10.0.0.5会报错?
你的代码核心是连接TCP端口13,这是Daytime服务的标准端口(RFC 867定义),服务器在这个端口监听时,会向连接的客户端返回当前系统时间。
出现Connection refused的根本原因是:
你的本地机器(10.0.0.5)并没有在TCP端口13上运行任何监听服务。
现代Linux发行版默认不会开启这类闲置的传统服务(出于安全和资源优化考虑),而书中示例用的206.168.112.96是一个预先配置了Daytime服务的远程服务器,所以能成功建立连接。
inet_pton应该使用什么地址?
inet_pton的作用是将人类可读的IP字符串转换为网络字节序的二进制地址,它对地址的要求很明确:
- 必须是合法的IPv4(或IPv6,对应
AF_INET6)格式字符串(比如你用的10.0.0.5就符合要求) - 更关键的是:这个地址对应的主机,必须在TCP端口13上运行着监听服务
你可以选择以下两种地址来测试你的代码:
- 公共Daytime服务器地址:虽然现在这类公共服务不多,但仍有一些测试服务器提供该服务(比如部分大学或开源测试平台的主机)
- 自己搭建的本地服务地址:
- 临时开启Daytime服务:比如通过
xinetd配置开启(需要修改/etc/xinetd.d/daytime并重启服务) - 自己写一个极简的TCP服务器:监听端口13,收到连接后返回任意字符串(比如当前时间),然后用你的客户端代码连接10.0.0.5就能成功
- 临时开启Daytime服务:比如通过
快速验证方法
你可以先用telnet命令测试目标地址的端口13是否开放:
telnet 10.0.0.5 13
如果返回Connection refused,就确认是没有服务在监听;如果能建立连接并收到内容,说明服务正常,你的客户端代码也能正常工作。
内容的提问来源于stack exchange,提问作者milanHrabos




