linux网络通信移植,基于socket API的C/S通信:将Qt程序从Linux移植到windows
Qt是一個跨平臺的GUI開發語言,它是對C++在圖形設計方面上的一種擴充。Qt本身包含一系列用來設計圖形界面的類,并且對C++原有的類都進行了再次封裝。如果你的程序采用Qt的類庫,那么源程序在不同平臺重新編譯即可;如果程序中使用某些C++或C庫函數,那么在移植時就需要針對不同平臺作一些改動。
本文所舉例的移植代碼是基于socket API的C/S模型的客戶端,該客戶端的原始代碼在linux系統下完成(以下稱為“源代碼”),現在要將其移植到windows平臺下(以下稱“移植代碼”)。源代碼的界面部分采用Qt完成,而通信部分則是采用原始的socket接口。
1.加入動態庫
在linux系統中,socket API屬于libc庫,因此只需在程序中加頭文件即可。而在windows系統下,由于socket接口是繼承Unix系統而來,因此需要加入wsock32庫,并且加上相應的頭文件winsock2.h。加入該庫具體的做法是在工程問價中加入下面的語句:
LIBS += -lwsock32
2.初始化套接字庫
在windows下有兩套socket API,一種是經過C++封裝的csocket類,而另一種則是原始的socket接口,為了降低移植的復雜性,我們采用后者。
在將wsock32動態庫加入移植程序后,socket接口還不能使用,因為在這之前必須使用WSAStartup函數對該庫進行初始化。具體的初始化代碼可以參考如下:
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1,1);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
return;
}
if ( LOBYTE(wsaData.wVersion) != 1 ||
HIBYTE(wsaData.wVersion) != 1 ) {
WSACleanup();
return;
WSAStartup函數有兩個參數,wVersionRequested用來向該函數傳遞socket接口調用者可以使用socket的最高版本號,通過MAKEWORD宏即可完成版本號的組裝,該變量的低字節指定主版本號而低字節指定次版本號。wsaData用來接收socket函數執行期間的一些數據。
當WSAStartup函數初始化動態庫成功時返回0,否則返回-1。
當初始化成功后,還要再確認已加載的動態庫的版本是否和我們所指定的動態庫版本相吻合,如果不符合,則通過WSACleanup函數清除已加載的動態庫。
動態庫加載成功后,接下來就可以使用socket接口函數了,當使用完畢時,需要用WSACleanup函數卸載動態庫。
3.更改套接字描述符
在使用一系列socket接口之前,必須使用socket函數創建套接字。在linux下,原始的socket函數返回的套接字描述符是整型,但是在windows下,該函數返回的套接字描述符是SOCKET類型。因此源代碼和移植代碼參考如下:
源代碼:
int sockfd;
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
ui->statusLabel->setText("ERROR:socket connceting fail!");
exit(1);
}
移植代碼:
SOCKET sockfd;
if ((cli.sockfd = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {
ui->statusLabel->setText("ERROR:socket connceting fail!");
exit(1);
}
既然在移植代碼中套接字描述符不是整型,那么其錯誤返回值也應該不是-1而是標準的錯誤返回值INVALID_SOCKET。
4.close函數
源代碼中關閉套接字選用close(),而移植程序相應的使用closesocket()。并且此時用WSACleanup()關閉已加載的動態庫。
進過上述幾個部分的修改,此時移植程序在windows下即可編譯成功。
總結
以上是生活随笔為你收集整理的linux网络通信移植,基于socket API的C/S通信:将Qt程序从Linux移植到windows的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jmeter参数值只读取了第一个_基础入
- 下一篇: linux 其他常用命令