資源描述:
《linux socket網(wǎng)絡(luò)編程詳解》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、linuxsocket網(wǎng)絡(luò)編程詳解2009年03月18日星期三22:56什么是Socket Socket接口是TCP/IP網(wǎng)絡(luò)的API,Socket接口定義了許多函數(shù)或例程,程式員能夠用他們來研發(fā)TCP/IP網(wǎng)絡(luò)上的應(yīng)用程式。要學(xué)Internet上的TCP/IP網(wǎng)絡(luò)編程,必須理解Socket接口。Socket接口設(shè)計(jì)者最先是將接口放在Unix操作系統(tǒng)里面的。假如了解Unix系統(tǒng)的輸入和輸出的話,就很容易了解Socket了。網(wǎng)絡(luò)的Socket數(shù)據(jù)傳輸是一種特別的I/O,Socket也是一種文檔描述符。Socket也具
2、備一個類似于打開文檔的函數(shù)調(diào)用Socket(),該函數(shù)返回一個整型的Socket描述符,隨后的連接建立、數(shù)據(jù)傳輸?shù)炔僮鞫际峭ㄟ^該Socket實(shí)現(xiàn)的。常用的Socket類型有兩種:流式Socket(SOCK_STREAM)和數(shù)據(jù)報(bào)式Socket(SOCK_DGRAM)。流式是一種面向連接的Socket,針對于面向連接的TCP服務(wù)應(yīng)用;數(shù)據(jù)報(bào)式Socket是一種無連接的Socket,對應(yīng)于無連接的UDP服務(wù)應(yīng)用。Socket建立 為了建立Socket,程式能夠調(diào)用Socket函數(shù),該函數(shù)返回一個類似于文檔描述符的句柄。
3、socket函數(shù)原型為: intsocket(intdomain,inttype,intprotocol);domain指明所使用的協(xié)議族,通常為PF_INET,表示互連網(wǎng)協(xié)議族(TCP/IP協(xié)議族);type參數(shù)指定socket的類型:SOCK_STREAM或SOCK_DGRAM,Socket接口還定義了原始Socket(SOCK_RAW),允許程式使用低層協(xié)議;protocol通常賦值"0"。Socket()調(diào)用返回一個整型socket描述符,您能夠在后面的調(diào)用使用他?! ocket描述符是個指向內(nèi)部數(shù)據(jù)結(jié)構(gòu)
4、的指針,他指向描述符表入口。調(diào)用Socket函數(shù)時,socket執(zhí)行體將建立一個Socket,實(shí)際上"建立一個Socket"意味著為一個Socket數(shù)據(jù)結(jié)構(gòu)分配存儲空間。Socket執(zhí)行體為您管理描述符表。 兩個網(wǎng)絡(luò)程式之間的一個網(wǎng)絡(luò)連接包括五種信息:通信協(xié)議、本地協(xié)議地址、本地主機(jī)端口、遠(yuǎn)端主機(jī)地址和遠(yuǎn)端協(xié)議端口。Socket數(shù)據(jù)結(jié)構(gòu)中包含這五種信息。Socket配置通過socket調(diào)用返回一個socket描述符后,在使用socket進(jìn)行網(wǎng)絡(luò)傳輸以前,必須配置該socket。面向連接的socket客戶端通過調(diào)用C
5、onnect函數(shù)在socket數(shù)據(jù)結(jié)構(gòu)中保存本地和遠(yuǎn)端信息。無連接socket的客戶端和服務(wù)端連同面向連接socket的服務(wù)端通過調(diào)用bind函數(shù)來配置本地信息。Bind函數(shù)將socket和本機(jī)上的一個端口相關(guān)聯(lián),隨后您就能夠在該端口監(jiān)聽服務(wù)請求。Bind函數(shù)原型為: intbind(intsockfd,structsockaddr*my_addr,intaddrlen); Sockfd是調(diào)用socket函數(shù)返回的socket描述符,my_addr是個指向包含有本機(jī)IP地址及端口號等信息的sockaddr類型的指
6、針;addrlen常被配置為sizeof(structsockaddr)?! tructsockaddr結(jié)構(gòu)類型是用來保存socket信息的: structsockaddr{ unsignedshortsa_family;/*地址族,AF_xxx*/charsa_data[14];/*14字節(jié)的協(xié)議地址*/}; sa_family一般為AF_INET,代表Internet(TCP/IP)地址族;sa_data則包含該socket的IP地址和端口號?! ×硗飧幸环N結(jié)構(gòu)類型: structsockaddr_i
7、n{ shortintsin_family;/*地址族*/ unsignedshortintsin_port;/*端口號*/ structin_addrsin_addr;/*IP地址*/ unsignedcharsin_zero[8];/*填充0以保持和structsockaddr同樣大小*/ };這個結(jié)構(gòu)更方便使用。sin_zero用來將sockaddr_in結(jié)構(gòu)填充到和structsockaddr同樣的長度,能夠用bzero()或memset()函數(shù)將其置為零。指向sockaddr_in的指針和指向so
8、ckaddr的指針能夠相互轉(zhuǎn)換,這意味著假如一個函數(shù)所需參數(shù)類型是sockaddr時,您能夠在函數(shù)調(diào)用的時候?qū)⒁粋€指向sockaddr_in的指針轉(zhuǎn)換為指向sockaddr的指針;或相反?! ∈褂胋ind函數(shù)時,能夠用下面的賦值實(shí)現(xiàn)自動獲得本機(jī)IP地址和隨機(jī)獲取一個沒有被占用的端口號: my_addr.sin_port=0;/*系統(tǒng)隨機(jī)選擇一