【go语言 socket编程系列】IPAddr类型及ResolveIPAddr方法
【类型定义】
IPAddr类型本质上是一个IP类型,源码定义文件:golang/src/pkg/net/iprawsock.go
常用方法会返回一个*IPAddr的数据。
package net// IPAddr represents the address of an IP end point.
type IPAddr struct {IP IPZone string // IPv6 scoped addressing zone
}
【net.ResolveIPAddr 方法】
func ResolveIPAddr(net, addr string) (*IPAddr, error)
将addr解析成ip,返回一个*IPAddr数据
net 参数为 "ip", "ip4" 或者为"ip6",net 为空这默认 ip
源码如下
// ResolveIPAddr parses addr as an IP address of the form "host" or
// "ipv6-host%zone" and resolves the domain name on the network net,
// which must be "ip", "ip4" or "ip6".
func ResolveIPAddr(net, addr string) (*IPAddr, error) {if net == "" { // a hint wildcard for Go 1.0 undocumented behaviornet = "ip"} afnet, _, err := parseNetwork(net)if err != nil {return nil, err } switch afnet {case "ip", "ip4", "ip6":default:return nil, UnknownNetworkError(net)} a, err := resolveInternetAddr(afnet, addr, noDeadline)if err != nil {return nil, err } return a.toAddr().(*IPAddr), nil
}
主要调用到以下两个函数
1、parseNetwork(net)
2、resolveInternetAddr(afnet, addr, noDeadline)
parseNetwork 函数定义如下,在dial.go文件中。
会调用lookupProtocol(protostr)方法 从unix操作系统中的/etc/protocols文件中查找协议名词,并返回相应的协议号
func parseNetwork(net string) (afnet string, proto int, err error) {i := last(net, ':')if i < 0 { // no colonswitch net {case "tcp", "tcp4", "tcp6":case "udp", "udp4", "udp6":case "ip", "ip4", "ip6":case "unix", "unixgram", "unixpacket":default:return "", 0, UnknownNetworkError(net)}return net, 0, nil}afnet = net[:i]switch afnet {case "ip", "ip4", "ip6":protostr := net[i+1:]proto, i, ok := dtoi(protostr, 0)if !ok || i != len(protostr) {proto, err = lookupProtocol(protostr)if err != nil {return "", 0, err}}return afnet, proto, nil}return "", 0, UnknownNetworkError(net)
}
resolveInternetAddr函数定义如下,在 ipsock.go文件中
// resolveInternetAddr resolves addr that is either a literal IP// address or a DNS name and returns an internet protocol family// address. It returns a list that contains a pair of different// address family addresses when addr is a DNS name and the name has// mutiple address family records. The result contains at least one// address when error is nil.
func resolveInternetAddr(net, addr string, deadline time.Time) (netaddr, error) {var (err errorhost, port, zone stringportnum int)switch net {case "tcp", "tcp4", "tcp6", "udp", "udp4", "udp6":if addr != "" {if host, port, err = SplitHostPort(addr); err != nil {return nil, err}if portnum, err = parsePort(net, port); err != nil {return nil, err}}case "ip", "ip4", "ip6":if addr != "" {host = addr}default:return nil, UnknownNetworkError(net)}inetaddr := func(ip IP) netaddr {switch net {case "tcp", "tcp4", "tcp6":return &TCPAddr{IP: ip, Port: portnum, Zone: zone}case "udp", "udp4", "udp6":return &UDPAddr{IP: ip, Port: portnum, Zone: zone}case "ip", "ip4", "ip6":return &IPAddr{IP: ip, Zone: zone}default:panic("unexpected network: " + net)}}if host == "" {return inetaddr(nil), nil}// Try as a literal IP address.var ip IPif ip = parseIPv4(host); ip != nil {return inetaddr(ip), nil}if ip, zone = parseIPv6(host, true); ip != nil {return inetaddr(ip), nil}// Try as a DNS name.host, zone = splitHostZone(host)ips, err := lookupIPDeadline(host, deadline)if err != nil {return nil, err}var filter func(IP) IPif net != "" && net[len(net)-1] == '4' {filter = ipv4only}if net != "" && net[len(net)-1] == '6' || zone != "" {filter = ipv6only}return firstFavoriteAddr(filter, ips, inetaddr)
}
【代码实现】
net.ResolveIPAddr方法调用的代码实现
package mainimport ("fmt""net""os"
)func main() {mydns := "www.csdn.net"addr, err := net.ResolveIPAddr("ip", mydns)checkError(err)fmt.Println("dns is:", mydns)fmt.Println("ip is:", addr.String())}func checkError(err error) {if err != nil {fmt.Println("Fatal err!", err.Error())os.Exit(1)}
}
编译执行
$./l_ResolveIPAddr
dns is: www.csdn.net
ip is: 47.95.164.112
$
【go语言 socket编程系列】IPAddr类型及ResolveIPAddr方法相关推荐
- 【go语言 socket编程系列】net.DialTCP、net.DIalUDP与net.Dial
[函数原型] func DialTCP(network string, laddr, raddr *TCPAddr) (*TCPConn, error) func DialUDP(network s ...
- 怎么调用获取被创建的预制体_Go 语言 Web 编程系列—— 获取用户请求数据(上)...
0.GET/POST 请求数据 在 PHP 中,可以直接通过全局变量 $_GET 和 $_POST 快速获取 GET/POST 请求数据,GET 请求数据主要是 URL 查询字符串中包含的参数,以前面 ...
- C语言SOCKET编程指南
转载自:http://blog.sina.com.cn/s/blog_79b01f66010163q3.html 这篇文章完全可以作为c语言socket编程指南,无论在任何系统下.感谢作者fenglo ...
- go语言socket编程
go语言socket编程 用go写socket非常简单,如果你了解其他语言的socket的话一看便知,如果想深入的话,个人建议看uninx网络编程套接字联网API这本书. 在go中,网络协议被封装的非 ...
- C语言 socket编程实例
C语言 socket编程实例 一. 面向连接的流式套接字 C/S 例子 二. 非阻塞的多人聊天服务器端例子 三. 简单的 IPv6 UDP socket编程 四.使用wireshark抓包分析tcp协 ...
- c语言soket编程,C语言socket编程使用方法
C语言socket编程使用方法 C语言是一门通用计算机编程语言,应用广泛.C语言的设计目标是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言.以 ...
- 钻星图的c语言的编程,C 语言Socket编程教程 pdf
南漳谬悠情节层析德雅青豆丹佛脉理密封.夺理秋月弹流清切壳菜夺得沙梨.临朐硕壮着迷僚婿母权欣欣气急波器,倒把迟迟供肥东辽电学片盘挂钟劈胸麦片!龙乡足板比美性病内屏:涣然树立马具闹哄啪唧每场水力儒艮: 励 ...
- C语言Socket编程为什么要将sockaddr_in强制转换成sockaddr?
在阅读尹圣雨<TCP/IP网络编程>(C语言示例)的时候,看到将sockaddr_in类型的struct的指针强制转换成了sockaddr类型的指针. 比如hello_client.c: ...
- linux C语言 socket编程教程(附两个例子)(socket教程)
文章目录 1.网络中进程之间如何通信? 2.什么是Socket? 3.socket的基本操作 3.1.socket()函数 3.2.bind()函数 网络字节序与主机字节序 3.3.listen(). ...
最新文章
- Calendar如何只显示“一、二、三...日”,不显示“星期”
- SCCM2012 RBA
- VC++:如何将程序最小化到托盘
- 【土地评价与土地管理】案例:兰州市榆中县农用地分等
- 甘肃省事业单位公考招聘考试权威复习资料---GIS专业全真模拟题(一)
- pandas中size方法_如何使用pdpipe与Pandas构建管道?
- mysql rr gap nextkey_mysql中的各种锁把我搞糊涂啦~
- C++设计模式解析之单例模式解析
- rsync增量同步标志位详细解释
- 今日笔记:Envi利用bandmath修改特定dn值
- element 如何使用自定义icon图标
- 编辑中的word变成只读_教大家word文档变成只读模式怎么改
- mysql ndb存储引擎_ndb 存储引擎
- 基于Keras2《面向小数据集构建图像分类模型》——Kaggle猫狗数据集
- 【总结】大学四年来,用过的一些网站整理
- 2019网络统考计算机基础,2019年12月网络教育统考《计算机应用基础》复习题(十)...
- ubuntu 12.04 从硬盘安装过程
- 开源!!!100多个常用API接口免费分享!建议收藏!
- “泥腿子”办银行 浙江省首家农村资金互助社成立
- C/C++版本更迭历程
热门文章
- 如何用C语言实现小游戏——扫雷
- C++编程练习 利用嵌套循环实现各类三角形图案
- EXCEL 2016常用知识--Excel数据透视表
- Oracle数据字典表
- matlab likelihood,Matlab做空间面板模型log-likelihood为NAN怎么办
- 天玑9200搭载Arm最新旗舰GPU,性能爆表!支持移动端硬件光追
- java获取当前时间戳
- Matlab 多项式曲线拟合polyfit
- 用支持向量机解决蠓虫分类问题matlab,分类问题
- 【Java字符串分割[split()]和截取[substring()]】