QT:Qt 网络编程基础

Qt 网络编程基础

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();
}


相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页