瞿蘇
摘要:網(wǎng)絡(luò)是一個奇跡,它將人們帶入一個豐富多彩的新世界,使人們更方便地交流以及實現(xiàn)資源共享。如今的嵌入式計算機、PAD以及智能手機提供了強大的網(wǎng)絡(luò)支持,可以非常方便地訪問局域網(wǎng)乃至互聯(lián)網(wǎng)。掌握Windows CE網(wǎng)絡(luò)編程技術(shù),對人們來說就顯得尤為重要。在Windows CE中進(jìn)行網(wǎng)絡(luò)編程,需要首先了解Winsock套接字基礎(chǔ)知識,然后再了解套接字基礎(chǔ)知識在TCP通訊上的運用。
關(guān)鍵詞:Windows CE;socket;TCP
中圖分類號:TP393 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2016)30-0058-03
The Network Communication Programming Based on Wince
QU Su
(Yangzhou Business branch of Jiangsu Union Technical Institue, Yangzhou 225000, China)
Abstract: Internet is a miracle, it brought people into a colorful world, make people more convenient communication and realize resources sharing. Now embedded computer, PAD, and smart phone provides a strong support network, can be very convenient to access to the LAN and the Internet. Master Windows CE network programming technology, it is very important to people. Network programming in Windows CE, need to first understand the Winsock basic knowledge of the socket, and then understand the basic knowledge of the socket in the use of TCP communications.
Key words: Windows CE; socket;TCP
1 套接字編程基礎(chǔ)
1.1 簡介
BSD UNIX規(guī)范定義的一套MicrsoftWindows下的網(wǎng)絡(luò)編程接口,規(guī)范中包含了Windows的擴展庫函數(shù)和BerkeleySocket風(fēng)格的庫函數(shù)。
所有的應(yīng)用程序開發(fā)者可使用Windows Sockets規(guī)范提供的一套簡單的API函數(shù)和共同遵守這項規(guī)范。Windows Sockets有一個接口,為二進(jìn)制接口(ABI),目的是為了保證Windows Sockets API應(yīng)用程序的所有軟件供應(yīng)商都能夠遵循Windows Sockets協(xié)議而工作。
網(wǎng)絡(luò)軟件供應(yīng)商可以充分地使用Windows Sockets規(guī)范定義的庫函數(shù)和相關(guān)語義。
“Windows Sockets兼容的”的含義是遵守Windows Sockets規(guī)范的網(wǎng)絡(luò)軟件。任何一個網(wǎng)絡(luò)軟件供應(yīng)商必須完全實現(xiàn)Windows Sockets規(guī)范,才能正在做到Windows Sockets兼容。其中,Windows Sockets規(guī)范涉及兩個概念“提供者”和“Windows Sockets應(yīng)用程序”?!疤峁┱摺奔碬indows Sockets兼容實現(xiàn)的提供者;“Windows Sockets應(yīng)用程序”即被稱為具有Windows Sockets接口,是能夠與Windows Sockets兼容實現(xiàn)協(xié)同工作的任何應(yīng)用程序。
如“應(yīng)用程序同Winsock關(guān)系圖”所示,Windows Sockets利用網(wǎng)絡(luò)編程、網(wǎng)絡(luò)通訊協(xié)議服務(wù)和操作系統(tǒng),實現(xiàn)應(yīng)用程序之間實際的通訊工作,并且Windows Sockets應(yīng)用程序調(diào)用Windows Sockets 的API以實現(xiàn)相互之間的通訊。
1.2 Windows CE平臺中的SocketAPI函數(shù)
1.2.1 創(chuàng)建套接字
可以通過socket函數(shù)來創(chuàng)建套接字,它的聲明如下:
當(dāng)socket函數(shù)返回套接字句柄時,表明創(chuàng)建套接字成功;當(dāng)socket函數(shù)返回Invalid_socket,表明創(chuàng)建套接字不成功,同時可以通過調(diào)用WSAGetLastError函數(shù),獲取具體錯誤代碼。
1.2.2 關(guān)閉套接字
Closesocket函數(shù),即關(guān)閉套接字。當(dāng)創(chuàng)建的套接字,然后不再使用時需關(guān)閉并釋放資源,可調(diào)用Closesocket函數(shù)。當(dāng)程序員想調(diào)用closesocket函數(shù)之前,必須先調(diào)用shutdown函數(shù),該過程的目的是“從容中斷連接”。為了防止調(diào)用closesocket函數(shù)時產(chǎn)生負(fù)面影響,數(shù)據(jù)可能會丟失的現(xiàn)象發(fā)生。因此提出了“從容中斷連接”技術(shù),即通信方收到應(yīng)用程序發(fā)出所有數(shù)據(jù)時,應(yīng)報證通信方立刻通知接收端“不再發(fā)送數(shù)據(jù)”。
Shutdown函數(shù)的定義如下:
1.2.3 綁定套接字
創(chuàng)建好套接字后,需通過bind函數(shù)將其綁定到一個已知的地址上。Bind函數(shù)的定義如下:
當(dāng)返回值為SOCKET_ERROR時,表明調(diào)用bind函數(shù)出錯。
如果另一個進(jìn)程同本地IP接口和端口號綁定到一起了,表明使用了TCP/IP,或者可能是那個IP接口和端口號處于TIME_WAIT狀態(tài)。調(diào)用bind函數(shù)時,則會出現(xiàn)最常見的錯誤WSAEADDRINUSE。還有一種情況,如果針對一個已經(jīng)被綁定的套接字調(diào)用了bind函數(shù),則會返回WSAEFFAULT錯誤。
有兩個特殊的IP地址可對特殊情況下的套接字行為產(chǎn)生影響,比如綁定套接字和本地接口連接時,網(wǎng)絡(luò)將運用特殊地址來監(jiān)聽連接。其中,用于一個IP網(wǎng)絡(luò)中發(fā)送廣播UDP數(shù)據(jù)報的特殊地址是INADDR_BROADCAST,在使用該地址時,需設(shè)置套接字選項SO_BROADCAST。
建立一個TCP連接時綁定套接字的方法。
1.2.4 監(jiān)聽套接字
程序員編寫TCP服務(wù)器端,將套接字與本地地址綁定后,調(diào)用listen函數(shù),并將套接字設(shè)置為監(jiān)聽模式,等待與客戶端連接。
Listen函數(shù)的定義如下:
1.2.5 等待連接
服務(wù)器端與客戶端連接,客戶端發(fā)出連接請求,服務(wù)器端則調(diào)用accept函數(shù)。當(dāng)accept函數(shù)調(diào)用成功后,將返回一個新的套接字,與客戶端的套接字連接進(jìn)行通訊。
accept函數(shù)的定義如下:
調(diào)用accept函數(shù)有兩種調(diào)用方式,分別是阻塞調(diào)用和非阻塞調(diào)用。當(dāng)套接字為阻塞模式時,accept函數(shù)以阻塞方式執(zhí)行,當(dāng)?shù)却犃兄谐霈F(xiàn)一個等待連接時,它才接收等待連接中的第一個連接請求。當(dāng)套接字為非阻塞模式時,只要等待隊列中存在連接請求,它將接收等待連接中的第一個連接請求,否則將返回INVALID_SOCKET。如果調(diào)用WSAGetLastError函數(shù)返回WSAEWOULDBLOCK值,則表示等待隊列目前已經(jīng)不存在請求。
1.2.6 建立連接
調(diào)用connect函數(shù)可以將TCP客戶端與TCP服務(wù)器建立。當(dāng)connect函數(shù)的返回值為0,套接字為阻塞方式時,表明和TCP服務(wù)器端已經(jīng)建立了連接。如果connect函數(shù)的返回值為SOCKET_ERROR,表明和TCP服務(wù)器端連接失敗。connect函數(shù)定義如下:
1.2.7 發(fā)送數(shù)據(jù)
套接字可以分為連接的套接字和非連接的套接字。程序員可以通過send函數(shù)實現(xiàn)連接套接字發(fā)送數(shù)據(jù)。send函數(shù)的定義如下:
2 TCP編程概述
TCP(Transmission Control Protocol 傳輸控制協(xié)議),是在主機間實現(xiàn)高可靠性的包交換傳輸?shù)囊环N協(xié)議。在網(wǎng)絡(luò)高速發(fā)展的今天,TCP的應(yīng)用非常廣泛,人們可以通過它來傳輸數(shù)據(jù)安全性要求較高的數(shù)據(jù)。TCP是一種無差錯無重復(fù)的順序數(shù)據(jù)傳輸方式,同時TCP的套接字為流式套接字。源程序和目標(biāo)程序利用TCP通信時,它們之間便搭建了一個虛擬連接進(jìn)行通訊,兩臺計算機之間是以雙向字節(jié)流形式而數(shù)據(jù)交換。
如TCP服務(wù)器和客戶端流程圖所示,TCP服務(wù)器端編程的流程為:1)TCP服務(wù)器端調(diào)用socket函數(shù)建立流式套接字;2)調(diào)用bind函數(shù)綁定本地地址;3)通過調(diào)用listen函數(shù)監(jiān)聽客戶端連接;4)當(dāng)監(jiān)聽到客戶端連接請求時,服務(wù)器套接字調(diào)用Accept函數(shù),并接受客戶端連接請求建立連接;5)服務(wù)器端新加一個單獨的套接字,與客戶端進(jìn)行通訊。
TCP服務(wù)器端與TCP客戶端過程比較而言,TCP客戶端編程過程簡單些。可分為如下幾個過程: 1)客戶端調(diào)用socket函數(shù)建立流式套接字;2)TCP客戶端調(diào)用connect函數(shù),請求與TCP服務(wù)器端連接;3)成功建立連接;4)TCP客戶端同TCP服務(wù)器端通訊。
下面以“打開TCP服務(wù)”為例,了解套接字中函數(shù)使用的方法與過程。
1)初始化Socket資源;2)創(chuàng)建TCP監(jiān)聽套接字;3)當(dāng)創(chuàng)建完TCP監(jiān)聽套接字后,調(diào)用bind函數(shù)綁定套接字和本地地址;4)監(jiān)聽套接字開始監(jiān)聽;5)監(jiān)聽線程處理與客戶端的連接。
Open函數(shù)的定義如下:
當(dāng)然,對于實際的項目,在使用時還應(yīng)當(dāng)根據(jù)實際情況做適當(dāng)?shù)男薷摹?/p>
3 總結(jié)
Microsoft Windows CE是一個緊湊、高效和可擴展的操作系統(tǒng),適應(yīng)于多種嵌入式產(chǎn)品。它的特點是擁有多任務(wù)、多線程、確定性的實時、完全搶先式優(yōu)先級的操作系統(tǒng)環(huán)境,專門面向的是只有有限資源的硬件系統(tǒng)。本文首先介紹了套接字編程基礎(chǔ)中套接字的基本命令,然后介紹了套接字在TCP編程上的使用。
參考文獻(xiàn):
[1]汪兵. Windows+CE+嵌入式高級編程及其實例詳解(用C++實現(xiàn))[M]. 北京:中國水利水電出版社, 2008:406-471.
[2]周建設(shè).Windows+CE設(shè)備驅(qū)動及BSP開發(fā)指南[M].中國電力出版社,2009:211-229.
[3]尹樂,許剛強.Windows+CE項目開發(fā)實踐叢書[M].中國高新技術(shù)企業(yè),2014(12):17-18.
[4]劉耀欽.在何時該用什么方式編譯WinCE[J].河南工程學(xué)院學(xué)報:自然科學(xué)版,2015(3):77-78.