首先,我们已经使用structsockaddr_in ina, 比如,“10.12.110.57”或者“2001:db8:63b3:1::3490”那我们怎么存储他呢?我们使用inet_pton()转换到结构中。(“pton”是presentation to network的简称。)
下面分别是基于IPv4和IPv6的代码:
struct sockaddr_insa; // IPv4
structsockaddr_in6 sa6; // IPv6
inet_pton(AF_INET,“192.0.2.1”,&(sa.sin_addr)); // IPv4
inet_pton(AF_INET6,“2001:db8:63b3:1::3490”,&(sa6.sin6_addr)); // IPv6
(注意:比较老的方式是使用inet_addr()或者inet_pton();但是他们不能工作在IPv6上)
可是,上面的代码不是鲁棒的,因为没有错误检查。比如,inet_pton()返回-1表示错误;或返回0表示地址没有。所以要检查返回值。
好,我们现在把IP地址字符串转换到二进制的形式。反之呢?我们怎么把struct in_addr 转换为点数形式的IP呢?(或者转化为冒号十六进制—Ipv6)在这里,你可以用inet_ntop()这个函数(ntop意味着network to presentation),像下面这样:
当你调用它时,你可以判断地址类型(IPv4或者IPv6),总是返回一个字符串指针,并且知道这个字符串的最大长度。(两个宏是做这个事的:INET_ADDRSTRLEN和INET6_ADDRSTRLEN)
(另外一个注意的转换函数是inet_ntoa()。他也不能工作在IPv6上)
最后,这些函数只能工作在数字IP地址上。
3.4.1. 私有网络
这些工作在放火墙后面的内部网络相对于外部网络要使用NAT(Network Address Translation)。
你是不是有点紧张?“哪来的怪异的东西?”
好了,这些事情我们都可以不考虑,他们由NAT处理。
实际上,在家里有一个防火墙。有2个已经分配的静态IPv4地址,并且在网络上有一些计算机。这怎么可能?两个计算机不能共享这些IP地址,而且我怎么知道数据从哪到那!
这个回答是:他们不能共享这些IP地址。他们分配的是私有网络地址。
部分内容省略…
关于私有网络地址的分配请参考RFC1918。
注C类地址中192.168.*.*是私有地址
分享到:
相关推荐
Beej’s Guide to Network Programming
C程序员套接字编程指南。 它提供了同时支持IPv6和IPv4的简单客户端和服务器的完整示例。
Beej's Guide to Network Programming Using Internet Sockets 101
Beej's Guide to Network Programming Using Internet Sockets 大师级人物的杰作 不用多说,只有49页,英文版,读完有种豁然开朗的感觉. 经典中的经典
网络编程经典书,学C++的必看,英文原版
Beej’s Guide to Network Programming Using Internet Sockets,希望对大家有帮助
beej-s-guide-to-network-programming-Chinese-zh.pdf
Beej's Guide to Network Programming has been one of the top socket programming guides on the Internet for the last 15 years, and it's now for the first time available as a lovingly bound paperback ...
Beej’s Guide to Network Programming Using Internet Sockets. 適用於Linux環境的網路程式開發教學文件
比网络编程>更适合初学者的linux网络编程书籍! 该书同样名气也很大!
Beej's Guide to Network Programming Using Internet Sockets For more info please refer to http://beej.us/guide/bgnet/
Beej新版的网络编程教程。增加了对ip v6的支持,层次更加合理。所有代码我都在Ubuntu下面测试过,没有问题。