为了编写一个类似QQ的聊天程序,学习了一下网络编程。在Qt的帮助手册中可以看到Qt NetWorkProgramming 模块,里面有介绍和一些例程。我从这些例程中慢慢摸索,慢慢学习了一些网络编程的知识,总结一下吧。
QT network 中有很多模块,介绍一下:
QNetworkInterface:
这是一个网络接口类,可以获得网络接口的信息(物理地址,ip地址,接口名字等),它有个flag属性,用于标识这些地址的类型、功能,比如组播,广播,活动的,点对点,回环,等等。
这些属性可以或,很多Qt的属性都可以或。
QNetworkAddressEntry:
上面的接口类可以获得 这个类的对象,这个类包含了IP,广播地址,子网掩码 。一定要由上面的接口类调用函数获得的这个类的对象才有用,以前我就以为天真的以为直接可以获得,实际上这个类就是数据封装。
QHostAddress :
这是一个主机地址类,介绍一个函数:
QPair<QHostAddress, int> QHostAddress::parseSubnet(const QString & subnet)
这个函数可以由 IP地址+子网掩码 计算出网络号和所占的位数,结果封装成QPair.
这里说一下网络号和子网掩码:因特网的IP地址都是唯一的,但是这么多电脑,怎么够用。。所以一般在公共网络里的电脑,像学校啊,单位什么的,都是有局域网的。所以你用的地址叫做本地连接。。一个大型的局域网里面 还会有 局域网,每个网络都会有一个网络号,网络中的每台主机都会有一个主机号,IP地址是由网络号+主机号计算出来的。子网掩码+IP地址可以计算出网络号和主机号。所以广播地址也会变。。而且在两个不同网络中的主机一般是无法直接通信的。。
QHostInfo :
看名字就知道了,这是一个主机信息类,可以获得网络中的主机信息
下面贴一段代码,这个可以获得 本地连接的 IP地址(实际上电脑中可能会有很多地址的)
address = QHostAddress::LocalHost;
foreach(QNetworkInterface interface,QNetworkInterface::allInterfaces()){
bool hasGetAdress = false;
if(interface.humanReadableName()!="本地连接") continue;
foreach(QNetworkAddressEntry entry,interface.addressEntries()){
if(entry.ip().protocol() == QAbstractSocket::IPv4Protocol){
address = entry.ip();
hasGetAdress = true;
break;
}
}
if(hasGetAdress) break;
}