資源描述:
《套接字編程基本原理講解》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。
1、套接字編程原理一、客戶機/服務(wù)器模式在網(wǎng)絡(luò)中最常用的通信模式是客戶機/服務(wù)器模式(Client/Server模式或C/S模式)。服務(wù)器方要先啟動,并監(jiān)聽指定端口,等待客戶端的請求,根據(jù)客戶端的請求提供相應(yīng)服務(wù)。二、基本套接字一般來說,要進行網(wǎng)絡(luò)通信,必須要在網(wǎng)絡(luò)的每一端都要建立一個套接字,兩個套接字之間是可以建立連接的,也是可以無連接的,并通過對套接字的“讀”、“寫”操作實現(xiàn)網(wǎng)絡(luò)通信功能。類似于文件的打開、讀、寫、關(guān)閉的方式。套接字有三種類型:數(shù)據(jù)流套接字(SOCK_STREAM):對應(yīng)TCP協(xié)議。數(shù)據(jù)報套接字(SOCK_DG
2、RAM):對應(yīng)UDP協(xié)議。原始套接字(SOCK_RAW)。通過使用原始套接字,可以將網(wǎng)卡設(shè)為混雜模式。并且可以捕獲到的數(shù)據(jù)包不僅僅是單純的數(shù)據(jù)信息,而是包含有IP頭、TCP頭等信息頭的最原始的數(shù)據(jù)信息,這些信息保留了它在網(wǎng)絡(luò)傳輸時的原貌,通過對這些在低層傳輸?shù)脑夹畔⒌姆治隹梢缘玫礁嗑W(wǎng)絡(luò)的信息。一個完整的網(wǎng)間通信需要一個五元組來標識:(協(xié)議,本地地址,本地端口號,遠地地址,遠地端口號)三、基本套接字系統(tǒng)調(diào)用為了更好地說明套接字編程原理,下面給出幾個基本套接字系統(tǒng)調(diào)用說明。1.創(chuàng)建套接字──socket()應(yīng)用程序在使用套接字
3、前,首先必須擁有一個套接字,系統(tǒng)調(diào)用socket()向應(yīng)用程序提供創(chuàng)建套接字的手段,其調(diào)用格式如下:SOCKETPASCALFARsocket(intaf,inttype,intprotocol);參數(shù)af:指定通信發(fā)生的區(qū)域,UNIX系統(tǒng)支持的地址族有:AF_UNIX、AF_INET、AF_NS等,而DOS、WINDOWS中僅支持AF_INET,它是互連網(wǎng)區(qū)域。參數(shù)type:描述要建立的套接字的類型。參數(shù)protocol:說明該套接字使用的特定協(xié)議,如果調(diào)用者不希望特別指定使用的協(xié)議,則置為0,使用默認的協(xié)議。根據(jù)這三個參數(shù)
4、建立一個套接字,并將相應(yīng)的資源分配給它,同時返回一個整型套接字號。socket()系統(tǒng)調(diào)用實際上指定了相關(guān)五元組中的“協(xié)議”這一元。2.指定本地地址──bind()將本地主機地址和本地端口與所創(chuàng)建的套接字號聯(lián)系起來,其調(diào)用格式如下:intPASCALFARbind(SOCKETs,conststructsockaddrFAR*name,intnamelen);參數(shù)s:是由socket()調(diào)用返回的套接字描述符(套接字號)。參數(shù)name:是賦給套接字s的本地地址,其長度可變,結(jié)構(gòu)隨通信域的不同而不同,TCP/IP協(xié)議使用的地址結(jié)
5、構(gòu)如下:structsockaddr_in{shortsin_family;/*AF_INET*/u_shortsin_port;/*16位端口號,網(wǎng)絡(luò)字節(jié)順序*/structin_addrsin_addr;/*32位IP地址,網(wǎng)絡(luò)字節(jié)順序*/charsin_zero[8];/*保留*/}網(wǎng)絡(luò)字節(jié)順序:不同的計算機存放多字節(jié)值的順序不同,有的機器在起始地址先存放低位字節(jié),有的先存高位字節(jié)。為保證數(shù)據(jù)的正確性,在網(wǎng)絡(luò)協(xié)議中須指定網(wǎng)絡(luò)字節(jié)順序。TCP/IP協(xié)議使用16位整數(shù)和32位整數(shù)的高價先存格式,它們均含在協(xié)議頭文件中。參數(shù)n
6、amelen:表明了name的長度。如果沒有錯誤發(fā)生,bind()返回0。否則返回值SOCKET_ERROR。3.建立套接字連接──connect()與accept()connect()用于建立連接。無連接的套接字進程也可以調(diào)用connect(),這樣就不必每次都指定目的地址。而accept()用于使服務(wù)器等待來自某客戶進程的實際連接。intPASCALFARconnect(SOCKETs,conststructsockaddrFAR*name,intnamelen);參數(shù)s:是欲建立連接的本地套接字描述符。參數(shù)name:為指
7、向?qū)Ψ教捉幼值刂方Y(jié)構(gòu)的指針。參數(shù)namelen:對方套接字地址結(jié)構(gòu)長度。如果沒有錯誤發(fā)生,connect()返回0。否則返回值SOCKET_ERROR。SOCKETPASCALFARaccept(SOCKETs,structsockaddrFAR*addr,intFAR*addrlen);參數(shù)s:為本地套接字描述符,在用做accept()調(diào)用的參數(shù)前應(yīng)該先調(diào)用過listen()。addr:指向客戶方套接字地址結(jié)構(gòu)的指針,用來接收連接實體的地址。Addrlen:為客戶方套接字地址結(jié)構(gòu)的長度。如果沒有錯誤發(fā)生,accept()返回
8、一個SOCKET類型的值,表示接收到的套接字的描述符。否則返回值INVALID_SOCKET。accept()用于面向連接服務(wù)器。參數(shù)addr和addrlen存放客戶方的地址信息。調(diào)用前,參數(shù)addr指向一個初始值為空的地址結(jié)構(gòu),而addrlen的初始值為0;調(diào)用accept