在Linux中的網絡編程是通過socket接口來進行的。我們常說的socket接口是一種特殊的I/O,它也是一種文件描述符,關于socket編程的應用可以參考英創公司光盤中使用必讀的相關內容。
現在在英創公司提供的例程Step3_TCPServe基礎上,加入Qt顯示單元,使其能通過顯示屏進行操作,基本的思想是還是利用Qt的信號和插槽機制進行對象間的通訊,當接收到的數據的時候,發出Signal,Qt 的事件循環中接收到這個信號,調用定義好的Slot顯示接收到的數據。
Step3_TCPServe是一個支持多個客戶端的連接TCPServer示例,該例程采用了面向對象的C++編程,創建了CTCPServer和CTCPCustom兩個類,其中CTCPServer類負責偵聽客戶端的連接,一旦有客戶端請求連接,它就負責接受此連接,并創建一個新的CTCPCustom類對象與客戶端進行通訊,然后CTCPServer類接著監聽客戶端的連接請求,所以需要讓CTCPServer類和CTCPCustom類繼承QObject類的屬性,使QObject成為CTCPServer類和CTCPCustom類的基類,然后在CTCPServer類和CTCPCustom類中各加入一個signal,讓CTCPServer類和CTCPCustom類的信號關聯,這樣當CTCPCustom類發出信號CTCPServer類也會發出信號,再讓CTCPServer類的信號和Qt顯示通過信號和插槽的機制連接,但是對于網絡通信的操作部分并不用做修改,原理如下圖:
繼承QObject類的屬性,加入信號和槽的方法在《英創Linux主板Qt串口應用程序簡介》中有較詳細的說明,在CTCPCustom類中,添加的方法也一樣,當判斷接收到數據時,發送信號,添加程序:
emit pSocket->readyRead(pSocket->RecvBuf);
在前面提到,在CTCPServer類中,當判斷有客戶端請求連接時,會創建一個CTCPCustom類對象與客戶端進行通訊,這時再將CTCPServer類和CTCPCustom類的信號關聯:
connect(pClientSocket,SIGNAL(readyRead(QString)),pSocket,SIGNAL(readyRead(QString)));
在Qt中,將兩個信號關聯,如同上面那樣,當pSocket中的信號發送時,pClientSocket中的信號也會跟著發送。
最后在顯示窗口Widget類中,將CTCPServer類的信號和顯示槽函數關聯:
connect(m_TCPServer,SIGNAL(readyRead(QString)),this,SLOT(readData(QString)),Qt::QueuedConnection);
然后可以在顯示界面中添加了一些其他功能組件,比如按鈕等,然后編寫組件的事件響應函數,實現想要的功能,在本例程中,添加了一些按鈕和顯示,用來選擇啟動TCPServer,顯示IP和端口號等,部分實現代碼如下:
void Widget::on_startpushButton_clicked() //偵聽按鈕
{
char buff_1[16],buff_2[16];
m_TCPServer=new CTCPServer;
m_TCPServer->m_LocalPort = 1001;
if((m_TCPServer->Open())<0)
{
QMessageBox::information(this,tr('錯誤'),tr('創建失敗'),QMessageBox::Yes);
delete m_TCPServer;
return;
}
connect(m_TCPServer,SIGNAL(readyRead(QString)),this,SLOT(readData(QString)),Qt::QueuedConnection); //關聯信號和槽
ui->startpushButton->setEnabled(false);
ui->textBrowser_3->setEnabled(true);
QString s=QString::number(m_TCPServer->m_LocalPort,10);
ui->textBrowser_3->insertPlainText(s); //顯示端口號
ui->textBrowser_2->setEnabled(true);
if((m_TCPServer->get_inetip('eth0',buff_1))==0)
{
//顯示eth0的IP地址
ui->textBrowser_2->append( QString(QLatin1String(buff_1)));
}
if((m_TCPServer->get_inetip('eth1',buff_2))==0)
{
//顯示eth1的IP地址
ui->textBrowser_2->append( QString(QLatin1String(buff_2)));
}
ui->closepushButton->setEnabled(true);
}
最后在工程中添加main.cpp,在main函數中,主要是對字體進行設置,并且顯示我們設計的窗口:
int main( int argc,char* argv[] )
{
QApplication a(argc, argv);
QFont font('simsun',9,QFont::Bold); //設置字體
QTextCodec::setCodecForTr(QTextCodec::codecForName('utf8'));
a.setFont(font);
Widget w;
w.show();
return a.exec(); //返回Qt事件循環
}
程序運行效果:
-
Linux
+關注
關注
87文章
11459瀏覽量
212788 -
嵌入式主板
+關注
關注
7文章
6096瀏覽量
36138
發布評論請先 登錄
龍芯主板是安全可信基石,可守護信息資產
Linux的作用
ElfBoard技術貼|如何在ELF 1開發板上交叉移植Qt

芯盛智能榮獲2024年信息技術應用創新工作委員會卓越貢獻成員單位
基于QT開發國產主板終端桌面程序 高效、穩定、跨平臺的解決方案
飛騰助力首屆教育信息技術應用創新大賽圓滿落幕
有方科技參編的信息技術團體標準發布
龍芯中科助力2024首屆教育信息技術應用創新大賽成功舉辦
中科創達榮獲2024年軟件和信息技術服務優秀企業
用國產化硬件守護信息安全,飛騰D2000網絡安全主板應用優勢
信創國產化背景下的工控主板發展現狀
Linux網絡協議棧的實現

評論