資源描述:
《VC socket編程》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、在網(wǎng)絡(luò)編程中最常用的方案便是Client/Server(客戶機(jī)/服務(wù)器)模型。在這種方案中客戶應(yīng)用程序向服務(wù)器程序請求服務(wù)。一個服務(wù)程序通常在一個眾所周知的地址監(jiān)聽對服務(wù)的請求,也就是說,服務(wù)進(jìn)程一直處于休眠狀態(tài),直到一個客戶向這個服務(wù)的地址提出了連接請求。在這個時刻,服務(wù)程序被"驚醒"并且為客戶提供服務(wù)-對客戶的請求作出適當(dāng)?shù)姆磻?yīng)?! 榱朔奖氵@種Client/Server模型的網(wǎng)絡(luò)編程,90年代初,由Microsoft聯(lián)合了其他幾家公司共同制定了一套WINDOWS下的網(wǎng)絡(luò)編程接口,即WindowsSockets規(guī)范,它不是一種網(wǎng)絡(luò)協(xié)議,而是
2、一套開放的、支持多種協(xié)議的Windows下的網(wǎng)絡(luò)編程接口。現(xiàn)在的Winsock已經(jīng)基本上實(shí)現(xiàn)了與協(xié)議無關(guān),你可以使用Winsock來調(diào)用多種協(xié)議的功能,但較常使用的是TCP/IP協(xié)議。Socket實(shí)際在計(jì)算機(jī)中提供了一個通信端口,可以通過這個端口與任何一個具有Socket接口的計(jì)算機(jī)通信。應(yīng)用程序在網(wǎng)絡(luò)上傳輸,接收的信息都通過這個Socket接口來實(shí)現(xiàn)?! ∥④洖閂isualC++定義了Winsock類如CAsyncSocket類和派生于CAsyncSocket的CSocket類,它們簡單易用,讀者朋友當(dāng)然可以使用這些類來實(shí)現(xiàn)自己的網(wǎng)絡(luò)程序,但
3、是為了更好的了解WinsockAPI編程技術(shù),我們這里探討怎樣使用底層的API函數(shù)實(shí)現(xiàn)簡單的Winsock網(wǎng)絡(luò)應(yīng)用程式設(shè)計(jì),分別說明如何在Server端和Client端操作Socket,實(shí)現(xiàn)基于TCP/IP的數(shù)據(jù)傳送,最后給出相關(guān)的源代碼?! ≡赩C中進(jìn)行WINSOCK的API編程開發(fā)的時候,需要在項(xiàng)目中使用下面的三個文件,否則會出現(xiàn)編譯錯誤?! ?.WINSOCK.H:這是WINSOCKAPI的頭文件,需要包含在項(xiàng)目中?! ?.WSOCK32.LIB:WINSOCKAPI連接庫文件。在使用中,一定要把它作為項(xiàng)目的非缺省的連接庫包含到項(xiàng)目文件中
4、去。? 3.WINSOCK.DLL:WINSOCK的動態(tài)連接庫,位于WINDOWS的安裝目錄下。 服務(wù)器端操作socket(套接字) 1.在初始化階段調(diào)用WSAStartup() 此函數(shù)在應(yīng)用程序中初始化WindowsSocketsDLL,只有此函數(shù)調(diào)用成功后,應(yīng)用程序才可以再調(diào)用其他WindowsSocketsDLL中的API函數(shù)。在程式中調(diào)用該函數(shù)的形式如下:WSAStartup((WORD)((1<<8
5、1),(LPWSADATA)&WSAData),其中(1<<8
6、1)表示我們用的是WinSocket1.1版本,WSAata用來
7、存儲系統(tǒng)傳回的關(guān)于WinSocket的資料。 2、建立Socket 初始化WinSock的動態(tài)連接庫后,需要在服務(wù)器端建立一個監(jiān)聽的Socket,為此可以調(diào)用Socket()函數(shù)用來建立這個監(jiān)聽的Socket,并定義此Socket所使用的通信協(xié)議。此函數(shù)調(diào)用成功返回Socket對象,失敗則返回INVALID_SOCKET(調(diào)用WSAGetLastError()可得知原因,所有WinSocket的API函數(shù)都可以使用這個函數(shù)來獲取失敗的原因)?! OCKETPASCALFARsocket(intaf,inttype,intprotocol)
8、 參數(shù):af:目前只提供PF_INET(AF_INET); type:Socket的類型(SOCK_STREAM、SOCK_DGRAM); protocol:通訊協(xié)定(如果使用者不指定則設(shè)為0); 如果要建立的是遵從TCP/IP協(xié)議的socket,第二個參數(shù)type應(yīng)為SOCK_STREAM,如為UDP(數(shù)據(jù)報(bào))的socket,應(yīng)為SOCK_DGRAM?! ?、綁定端口 接下來要為服務(wù)器端定義的這個監(jiān)聽的Socket指定一個地址及端口(Port),這樣客戶端才知道待會要連接哪一個地址的哪個端口,為此我們要調(diào)用bind()函
9、數(shù),該函數(shù)調(diào)用成功返回0,否則返回SOCKET_ERROR?! ntPASCALFARbind(SOCKETs,conststructsockaddrFAR*name,intnamelen); 參數(shù):s:Socket對象名; name:Socket的地址值,這個地址必須是執(zhí)行這個程式所在機(jī)器的IP地址; namelen:name的長度;? 如果使用者不在意地址或端口的值,那么可以設(shè)定地址為INADDR_ANY,及Port為0,WindowsSockets會自動將其設(shè)定適當(dāng)之地址及Port(1024到5000之間的值)。
10、此后可以調(diào)用getsockname()函數(shù)來獲知其被設(shè)定的值?! ?、監(jiān)聽 當(dāng)服務(wù)器端的Socket對象綁定完成之后,服務(wù)器端必須建立一個監(jiān)聽的隊(duì)列