資源描述:
《Socket編程之C++實(shí)現(xiàn)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、一、套接字的編程學(xué)習(xí)1.1套接字的基本概念套接字類型:數(shù)據(jù)流套接字(SOCK_STREAM):對(duì)應(yīng)TCP協(xié)議。數(shù)據(jù)報(bào)套接字(SOCK_DGRAM):對(duì)應(yīng)UDP協(xié)議。原始套接字(SOCKET_RAW):包含了IP、TCP等信息頭,可獲得更多網(wǎng)絡(luò)信息。完整的網(wǎng)間通信包含:協(xié)議、本地地址、本地端口號(hào)、遠(yuǎn)地地址、遠(yuǎn)地端口號(hào)1.2基本套接字的系統(tǒng)調(diào)用為了更好地說(shuō)明套接字編程原理,下面給出幾個(gè)基本套接字的系統(tǒng)調(diào)用說(shuō)明。1.2.1創(chuàng)建套接字——socket()應(yīng)用程序在使用套接字前,首先必須擁有一個(gè)套接字,系
2、統(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;參數(shù)type:描述要建立的套接字的類型;參數(shù)protocol:說(shuō)明該套接字使用的特定協(xié)議,如果調(diào)用者不希望特別指定使用的協(xié)議,則置為0,使用默認(rèn)的協(xié)議。根據(jù)這三個(gè)參數(shù)建立一個(gè)套接字
3、,并將相應(yīng)的資源分配給它,同時(shí)返回一個(gè)整型套接字號(hào)。socket()系統(tǒng)調(diào)用實(shí)際上指定了相關(guān)五元組中的“協(xié)議”這一元。1.2.2指定本地地址——bind()將本地主機(jī)地址和本地端口與所創(chuàng)建的套接字號(hào)聯(lián)系起來(lái),其調(diào)用格式如下:intPASCALFARbind(SOCKETs,conststructsockaddrFAR*name,intnamelen);參數(shù)s:是由socket()調(diào)用返回的套接字描述符(整型套接字號(hào))。參數(shù)name:是賦給套接字s的本地地址,其長(zhǎng)度可變,結(jié)構(gòu)隨通信域的不同而不同,
4、TCP/IP協(xié)議使用的地址結(jié)構(gòu)如下:structsockaddr_in{shortsin_family;/*AF_INET*/u_shortsin_port;/*16位端口號(hào),網(wǎng)絡(luò)字節(jié)順序*/structin_addrsin_addr;/*32位IP地址,網(wǎng)絡(luò)字節(jié)順序*/charsin_zero[8];/*保留*/}網(wǎng)絡(luò)字節(jié)順序:不同的計(jì)算機(jī)存放多字節(jié)值的順序不同,有的機(jī)器在起始地址先存放低位字節(jié),有的先存高位字節(jié)。為保證數(shù)據(jù)的正確性,在網(wǎng)絡(luò)協(xié)議中須指定網(wǎng)絡(luò)字節(jié)順序。TCP/IP協(xié)議使用16位整
5、數(shù)和32位整數(shù)的高價(jià)先存格式,它們均含在協(xié)議頭文件中。參數(shù)namelen:表明了name的長(zhǎng)度。如果沒(méi)有錯(cuò)誤發(fā)生,bind()返回0。否則返回值SOCKET_ERROR。1.2.3建立套接字連接——connect()與accept()connect()用于建立連接。無(wú)連接的套接字進(jìn)程也可以調(diào)用connect(),這樣就不必每次都指定目的地址。而accept()用于使服務(wù)器等待來(lái)自某客戶進(jìn)程的實(shí)際連接。intPASCALFARconnect(SOCKETs,conststructsockaddrF
6、AR*name,intnamelen);參數(shù)s:是欲建立連接的本地套接字描述符。參數(shù)name:為指向?qū)Ψ教捉幼值刂方Y(jié)構(gòu)的指針。參數(shù)namelen:對(duì)方套接字地址結(jié)構(gòu)長(zhǎng)度。如果沒(méi)有錯(cuò)誤發(fā)生,connect()返回0。否則返回值SOCKET_ERROR。SOCKETPASCALFARaccept(SOCKETs,structsockaddrFAR*addr,intFAR*addrlen);參數(shù)s:為本地套接字描述符,在用做accept()調(diào)用的參數(shù)前應(yīng)該先調(diào)用過(guò)listen()。addr:指向客戶方
7、套接字地址結(jié)構(gòu)的指針,用來(lái)接收連接實(shí)體的地址。Addrlen:為客戶方套接字地址結(jié)構(gòu)的長(zhǎng)度。如果沒(méi)有錯(cuò)誤發(fā)生,accept()返回一個(gè)SOCKET類型的值,表示接收到的套接字的描述符。否則返回值INVALID_SOCKET。accept()用于面向連接服務(wù)器。參數(shù)addr和addrlen存放客戶方的地址信息。調(diào)用前,參數(shù)addr指向一個(gè)初始值為空的地址結(jié)構(gòu),而addrlen的初始值為0;調(diào)用accept()后,服務(wù)器等待從編號(hào)為s的套接字上接受客戶連接請(qǐng)求,而連接請(qǐng)求是由客戶方的connect(
8、)調(diào)用發(fā)出的。當(dāng)有連接請(qǐng)求到達(dá)時(shí),accept()調(diào)用將請(qǐng)求連接隊(duì)列上的第一個(gè)客戶方套接字地址及長(zhǎng)度放入addr和addrlen,并創(chuàng)建一個(gè)與s有相同特性的新套接字號(hào)。新的套接字可用于處理服務(wù)器并發(fā)請(qǐng)求。四個(gè)套接字系統(tǒng)調(diào)用,socket()、bind()、connect()、accept(),可以完成一個(gè)完全五元相關(guān)的建立。socket()指定五元組中的協(xié)議元。bind()指定五元組中的本地二元,即本地主機(jī)地址和端口號(hào),其用法與是否面向連接有關(guān):在服務(wù)器方,無(wú)論是否面向連接,均要調(diào)用bind()