南京邮电大学软件设计TCPIP网络通信程序设计实验报告Word格式文档下载.docx
《南京邮电大学软件设计TCPIP网络通信程序设计实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《南京邮电大学软件设计TCPIP网络通信程序设计实验报告Word格式文档下载.docx(34页珍藏版)》请在冰豆网上搜索。
Qt数据库中提供QtNetworkModule中的QHostInfo、QHostAddress、QNetworkInterface和QNetAddressEntry等类来查询网络参数。
QNetworkInterface类提供了程序所运行的主机IP地址和网络接口信息的列表,在一个网络接口信息中,包括一个或多个IP地址,每一个IP地址又包括和它相关的子网掩码和广播地址。
它们三者别封装在一个对象中QNetworkAddressEntry,网络接口信息也包括了硬件地址信息。
[1]
完成界面
运行出结果
3、关键实现代码及注解
1.在NetworkI文件中,添加
QT+=network
2.在头文件中添加如下代码:
#include<
QHostInfo>
QNetworkInterface>
public:
voidgetHostInformation();
publicslots:
voidslotDetail();
对QHostInfo、QNetworkInterface进行声明,添加槽函数。
3.在源文件中添加代码。
其中在构造函数的最后添加:
getHostInformation();
//用于取得主机信息
connect(detailBtn,SIGNAL(clicked()),this,SLOT(slotDetail()));
4.getHostInformation()函数用于取得主机信息。
具体实现代码如下:
voidNetworkInformation:
:
getHostInformation()
{
QStringlocalHostName=QHostInfo:
localHostName();
//取得本机主机名
LineEditLocalHostName->
setText(localHostName);
QHostInfohostInfo=QHostInfo:
fromName(localHostName);
//依照主机名取得相关主机信息,包括IP地址等。
QHostInfo:
fromName()函数通过主机名查找IP地址信息。
QList<
QHostAddress>
listAddress=hostInfo.addresses();
//取得主机的IP地址列表
if(!
listAddress.isEmpty())//取得的主机IP地址列表可能为空。
在不为空的情形下利用第一个IP地址。
{
LineEditAddress->
setText(listAddress.first().toString());
}
}
注释见上。
[2]
5.slotDetail()函数取得与网络接口相关的信息,具体实现代码如下:
slotDetail()//取得与网络接口相关的信息
QStringdetail="
"
;
list=QNetworkInterface:
allInterfaces();
//QNetworkInterface类提供了一个主机IP地址和网络接口的列表
for(inti=0;
i<
list.count();
i++)
QNetworkInterfaceinterface=list.at(i);
detail=detail+u8"
设备:
+interface.name()+"
\n"
//取得网络接口的名称
硬件地址:
+interface.hardwareAddress()+"
//取得网络接口的硬件地址
QNetworkAddressEntry>
entryList=interface.addressEntries();
//每一个网络接口包括0个或多个IP地址,每一个IP地址有选择性地与一个子网掩码和(或)一个广播地址相关联
//QNetworkAddressEntry类存储了被网络接口支持的一个IP地址,同时还包括与之相关的子网掩码和广播地址
for(intj=0;
j<
entryList.count();
j++)
QNetworkAddressEntryentry=entryList.at(j);
detail=detail+"
\t"
+u8"
IP地址:
+entry.ip().toString()+"
子网掩码:
+mask().toString()+"
广播地址:
+entry.broadcast().toString()+"
QMessageBox:
information(this,tr("
Detail"
),detail);
4、程序运行测试与结果
图1-1获取本机网络信息图1-2获取本机详细网络信息
五、程序设计中碰到的问题及改良思路
1.“详细”那个按钮单击时,没有明显的痕迹,故后期添加了一些特效。
将PushButton的属性checkable设置为真,那么运行时鼠标单击一下,按钮的颜色会变淡,再单击一下又会变亮,它是以颜色的的深浅来提示它的toggle的。
菜单栏中的一个选项,一样是用trigger来发射信号。
2.报错显现“cannotfindfilemain.pro
”,缘故是QT所利用的工程,目录树中显现汉字,空格等。
题目2大体C/S模式的通信实验
大体C/S模式的通信实验
编写程序实现一个基于UDP模式的通信程序和一个基于TCP模式的通信程序。
大体要求:
能输入运算机的IP地址和端口号,能输入、发送文本信息和显示同意的文本信息。
一、基于UDP模式
在UDP方式下,它是一个不靠得住的,面向数据报的无连接协议。
客户端并非与效劳器成立连接,它只负责挪用发送函数向效劳器发出数据报。
一样,效劳器也不从客户端接收连接,只负责挪用接收函数,等待来自某客户端的数据抵达。
Qt中通过QupSocket类实现UDP协议的编程。
Socket简单地说,确实是一个IP地址加一个port端口。
因为要传输数据,就要明白往哪个机子上传送,而IP地址确信了一台主机,可是这台机子上可能运行着各类各样的网络程序,这时就要利用一个端口来指定UDP程序。
因此说,Socket指明了数据报传输的途径。
编写两个程序,一个用来发送数据报,叫做客户端;
另一个用来接收数据报,叫做效劳器端,均应用UDP协议。
如此也就组成了所谓的C/S(客户端/效劳器)编程模型。
第一做效劳器端。
先在头文件中声明需要的各类控件,完成对应源代码,从而先形成一个效劳器的界面。
然后在头文件中添加需要的槽函数,在源文件中添加声明,设置好端口参数(本程序设置为5555)而且创建QUdpSocket,使程序能够定向发送广播地址。
接下来做客户端。
一样先在头文件中声明需要的各类控件,完成对应源代码,从而形成一个客户端的界面。
然后在构造函数中设置相对应的端口号参数(5555),概念CloseBtnClicked()和dataReceived()函数,最后实现客户端的功能。
图2-1UDP协议工作原理
图2-2UDP客户端与效劳器之间的交互方式
二、基于TCP模式
1.
图2-3TCP协议工作原理
2.
图2-4TCP客户端与效劳器间的交互时序
3.
图2-5TCP文件传输结构
效劳器端:
1.在UdpServer.pro中添加:
2.在头文件udpserver.h中添加需要的槽函数:
QUdpSocket>
声明,为了在Line21-32添加槽函数
QTimer>
voidStartBtnClicked();
voidtimeout();
private:
QLabel*TimerLabel;
QLineEdit*TextLineEdit;
QPushButton*StartBtn;
QVBoxLayout*mainLayout;
intport;
boolisStarted;
QUdpSocket*udpSocket;
QTimer*timer;
:
connect(StartBtn,SIGNAL(clicked()),this,SLOT(StartBtnClicked()));
port=6665;
//设置UDP的端口号参数,效劳器按时向此端口发送广播消息
isStarted=false;
udpSocket=newQUdpSocket(this);
timer=newQTimer(this);
//创建一个QUdpSocket
connect(timer,SIGNAL(timeout()),this,SLOT(timeout()));
//按时发送广播信息
4.StartBtnClicked()函数的具体代码:
voidUdpServer:
StartBtnClicked()//“开始”按钮函数的设定
isStarted)
StartBtn->
setText(u8"
停止"
);
timer->
start(1000);
isStarted=true;
else
开始"
isStarted=false;
stop();
5.timeout()函数完成了向端口发送广播消息的功能:
timeout()//完成向端口发送广播信息的功能
QStringmsg=TextLineEdit->
text();
intlength=0;
if(msg=="
)
return;
if((length=udpSocket->
writeDatagram(msg.toLatin1(),msg.length(),QHostAddress:
Broadcast,port))!
=msg.length())
//QHostAddress:
Broadcast指定向广播地址发送
客户端:
1.在中