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