Qt中socket程式設計

2021-05-26 23:55:38 字數 2593 閱讀 5344

在linux下進行網路程式設計,我們可以使用linux提供的統一的套接字介面。但是這種方法牽涉到太多的結構體,比如ip位址,埠轉換等,不熟練的人往往容易犯這樣那樣的錯誤。qt中提供的socket完全使用了類的封裝機制,使使用者不需要接觸底層的各種結構體操作。而且它採用qt本身的signal-slot機制,使編寫的程式更容易理解。

qserversocket:tcp-based server

qsocket:              buffered tcp connection

qsocketdevice:  platform-independent low-level socket api

qsocketnotifier: support for socket callbacks

下面介紹使用qt進行網路程式設計,我們使用乙個簡單的c/s模式網路程式說明如何使用qt中的套接字。同時我們用tcp和udp兩種協議實現這個程式(該程式客戶端與服務端各向對方傳送乙個字元口串「abc」)

1、udp實現

udp是不連線協議,沒有客戶端與服務端的概念。

1)建立套接字相關物件

qsocketdevice *mureceivesocket;   //套接字物件

qsocketnotifier *msocketnotifier;     //套接字監聽物件

2)初始化套接字相關物件

mureceivesocket=new qsocketdevice(qsocketdevice::datagram);  

//udp初始化

qhostaddress myaddress;

qstring fakeaddress;

fakeaddress = get_eth1_ip();  //取得介面ip

myaddress.setaddress(fakeaddress);

mureceivesocket->bind(myaddress,port);  

//繫結到指定網路介面位址(ip),指定邏輯埠

msocketnotifier = new qsocketnotifier(mureceivesocket->socket(),qsocketnotifier::read,0,"msocketnotifier");

//監聽mureceivesocket套接字

3)定義用實現響應slot

virtual void onmreceive();

void client::onmreceive()

4)關聯套接字的signal和接收slot

connect(msocketnotifier,signal(activated(int)),this,slot(onmreceive()));

//當msocketnotifier檢測到mureceivesocket活躍時呼叫onmreceive

5)傳送字串

char information[20];

strcpy(information,「abc「);

mureceivesocket->writeblock(information,length,myaddress,2201);

2、tcp實現

tcp的實現與udp的實現大同小異,它是面象連線的協議。這裡只介紹與udp不同的地方。

服務端:

1)套接字物件的定義

比udp多定義乙個套接字,乙個用來監聽埠,乙個用來通訊。

建立乙個qssocket類繼承qserversocket

qssocket *serversocket;    //tcp-based server

qsocketdevice *clientsocket;

qsocketnotifier *clientnotifier;

qsocketnotifier *servernotifier;

2)套接字的初始化

qhostaddress myaddress;

qstring fakeaddress;

fakeaddress = "127.0.0.1";

myaddress.setaddress(fakeaddress);

uint port=1234;

serversocket=new qssocket(myaddress,port,this,0);   //指定監聽位址及埠

//這裡也可以使用qserversocket類

clientsocket=new qsocketdevice(qsocketdevice::stream);

clienttnotifier = new qsocketnotifier(clientsocket->socket(),qsocketnotifier::read,0,"clientsocket");

3)響應連線

只需要在qssocket的建構函式裡新增如下**:

serversocket->newconncetion(clientsocket->socket());

當收到客戶端的連線後,clientsocket自動響應,並接收資料。

4)接收資訊slot與udp一致,這裡不在敘述。

客戶端實現:

客戶端的實現與udp實現大同小異,不同的地方只是客戶端套接字不需要bind埠,因為連線上服務端後tcp會保持這個連線,直到通訊的結束。

QT中的SOCKET程式設計

作業系統 arm linux qt版本 qt 2.3.2 for linux gui qtopia 在linux下進行網路程式設計,我們可以使用linux提供的統一的套接字介面。但是這種方法牽涉到太多的結構體,比如ip位址,埠轉換等,不熟練的人往往容易犯這樣那樣的錯誤。qt中提供的socket完全使...

QT中的SOCKET程式設計

作業系統 arm linux qt版本 qt 2.3.2 for linux gui qtopia 在linux 下進行網路程式設計,我們可以使用linux提供的統一的套接字介面。但是這種方法牽涉到太多的結構體,比如ip位址,埠轉換等,不熟練的人往往容易犯這樣那樣的錯誤。qt中提供的socket完全...

QT中的SOCKET程式設計

作業系統 arm linux qt版本 qt 2.3.2 for linux gui qtopia 在linux下進行網路程式設計,我們可以使用linux提供的統一的套接字介面。但是這種方法牽涉到太多的結構體,比如ip位址,埠轉換等,不熟練的人往往容易犯這樣那樣的錯誤。qt中提供的socket完全使...