1 )网络协议层次 // linux/unix ---> 4 层 OSI ---> 7 层
应用层(应用层、表示层、会话层)
传输层(传输层) // TCP/IP协议 or UDP协议
网络接口层(网络层、数据链路层) // 链路:以太网协议;网络:IP协议
物理层(物理层) // 网卡本身
2 )TCP和UDP的区别 - '面试必问题'
TCP面向连接,相对与UDP传输比较"安全,不会丢包"。(如:QQ传文件)
UDP面向无连接,"传输效率高",安全性差,"容易丢包"。(如:QQ视频)
3 )socket - 'TCP'编程模型C/S
Server:
---> 创建socket套接字 socket ( )
---> 准备服务器地址 sockaddr_in
---> 绑定套接字和服务器地址,开放服务器端口 bind ( )
---> 监听未决连接 listen ( )
---> 接收客户端连接请求 accept ( )
---> 通信 read ( ) / write ( ) 或 recv ( ) / send ( )
---> 关闭socket套接字 close ( )
Client:
---> 创建socket套接字 socket ( )
---> 准备服务器地址 sockaddr_in
---> 连接服务器 connect ( )
---> 通信 read ( ) / write ( ) 或 recv ( ) / send ( )
---> 关闭套接字 close ( )
4 )socket - 'UDP'编程模型C/S
Server:
---> 创建socket套接字 socket ( )
---> 准备服务器地址 sockaddr_in
---> 绑定套接字和服务器地址,开放服务器端口 bind ( )
---> 通信 recvfrom ( ) / sendto ( )
---> 关闭套接字 close ( )
Client:
---> 创建socket套接字 socket ( )
---> 准备服务器地址 sockaddr_in
---> 通信 read ( ) / sendto ( )
---> 关闭套接字 close ( )
《案例》QT获取网络地址信息
#include <QHostAddress > // 网络地址
#include <QHostInfo > // 根据主机名获取网络地址信息
#include <QNetworkInterface > // 网络接口(网卡)信息
QT +=network // 关联 network 功能模块
/** 代码演示 **/
// NetInfoDialog.h
#ifndef NETINFODIALOG_H
#define NETINFODIALOG_H
#include <QDialog>
#include <QHostAddress> // 网络地址
#include <QHostInfo> // 根据主机名获取网络地址信息
#include <QNetworkInterface> // 网络接口(网卡)信息
#include <QMessageBox>
namespace Ui {
class NetInfoDialog;
}
class NetInfoDialog : public QDialog {
Q_OBJECT
public:
explicit NetInfoDialog(QWidget *parent = 0);
~NetInfoDialog();
private slots:
void on_pushButton_clicked();
private:
void getHostInfo (void);
private:
Ui::NetInfoDialog *ui;
};
#endif // NETINFODIALOG_H
// NetInfoDialog.cpp
#include "NetInfoDialog.h"
#include "ui_NetInfoDialog.h"
NetInfoDialog::NetInfoDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::NetInfoDialog) {
ui->setupUi(this);
getHostInfo ();
}
NetInfoDialog::~NetInfoDialog () {
delete ui;
}
// 获取主机名字和ip地址
void NetInfoDialog::getHostInfo (void) {
// 获取主机的名字
QString hostName = QHostInfo::localHostName ();
// 显示主机名字到ui界面
ui->hostNameEdit->setText (hostName);
// 根据主机名获取主机ip地址 "/etc/hosts"
QHostInfo info = QHostInfo::fromName (hostName);
// 获取对应的ipv4地址
QHostAddress addr_ipv4 = info.addresses ().first ();
// 显示对应的ip地址
ui->ipAddrEdit->setText (addr_ipv4.toString ());
}
// 获取网卡的详细地址并显示
void NetInfoDialog::on_pushButton_clicked () {
// 获取主机的所有的网卡
QList <QNetworkInterface> list = QNetworkInterface::allInterfaces ();
QString detail; // 保存网卡详细信息字符串
for (int i = 0; i < list.count (); i++) {
QNetworkInterface interface = list.at (i);
// 获取设备的名字
detail += "设备名字: " + interface.name () + "\n";
// 获取硬件地址
detail += "硬件地址: " + interface.hardwareAddress () + "\n";
// 获取IP地址,包括ipv4、ipv6
QList <QNetworkAddressEntry> entryList = interface.addressEntries ();
for (int j = 0; j < entryList.count (); j++) {
QNetworkAddressEntry entry = entryList.at (j);
detail += "IP地址: " + entry.ip ().toString () + "\n";
detail += "子网掩码: " + entry.netmask ().toString () + "\n";
detail += "广播地址: " + entry.broadcast ().toString () + "\n";
}
detail += "\n";
}
// 显示到ui消息窗口中
QMessageBox::information (this, "本机详细信息", detail);
}
// main.cpp
#include "NetInfoDialog.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
NetInfoDialog w;
w.show();
return a.exec();
}