QT中的SOCKET程式設計

2021-05-24 09:33:41 字數 2767 閱讀 1414

作業系統:arm-linux

qt版本:qt-2.3.2-for-linux

gui:qtopia

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

qt中共提供四個與套按字相關的類,分別是:

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多定義乙個套接字,乙個用來監聽埠,乙個用來通訊。

qsocketdevice *serversocket;

qsocketdevice *clientsocket;

qsocketnotifier *clientnotifier;

qsocketnotifier *servernotifier;

2)套接字的初始化

qhostaddress myaddress;

qstring fakeaddress;

fakeaddress = "127.0.0.1";

myaddress.setaddress(fakeaddress);

uint port=1234;

serversocket=new qsocketdevice(qsocketdevice::stream);

clientsocket=new qsocketdevice(qsocketdevice::stream);

serversocket->bind(myaddress,port);

serversocket->listen(20); //20代表所允許的最大連線數

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

servernotifier = new qsocketnotifier(serversocket->socket(),qsocketnotifier::read,0,"serversocket");

3)響應連線(在定義slot中響應)

當收到客戶端的連線後,響應它,並以clientsocket接收:

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

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

客戶端實現:

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

Qt中socket程式設計

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

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完全使...