資源描述:
《linux下socket網(wǎng)絡(luò)編程》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、Linux下Socket網(wǎng)絡(luò)編程,文件傳輸,數(shù)據(jù)傳輸?shù)腃語(yǔ)言例子2010年03月11日星期四16:15什么是SocketSocket接口是TCP/IP網(wǎng)絡(luò)的API,Socket接口定義了許多函數(shù)或例程,程序員可以用它們來(lái)開(kāi)發(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也具有一個(gè)類似于打開(kāi)文件的函數(shù)調(diào)用Socket(),
2、該函數(shù)返回一個(gè)整型的Socket描述符,隨后的連接建立、數(shù)據(jù)傳輸?shù)炔僮鞫际峭ㄟ^(guò)該Socket實(shí)現(xiàn)的。常用的Socket類型有兩種:流式Socket(SOCK_STREAM)和數(shù)據(jù)報(bào)式Socket(SOCK_DGRAM)。流式是一種面向連接的Socket,針對(duì)于面向連接的TCP服務(wù)應(yīng)用;數(shù)據(jù)報(bào)式Socket是一種無(wú)連接的Socket,對(duì)應(yīng)于無(wú)連接的UDP服務(wù)應(yīng)用。Socket建立為了建立Socket,程序可以調(diào)用Socket函數(shù),該函數(shù)返回一個(gè)類似于文件描述符的句柄。socket函數(shù)原型為:intsocket(intdomain,inttype,intprotocol);domain指明所使
3、用的協(xié)議族,通常為PF_INET,表示互聯(lián)網(wǎng)協(xié)議族(TCP/IP協(xié)議族);type參數(shù)指定socket的類型:SOCK_STREAM或SOCK_DGRAM,Socket接口還定義了原始Socket(SOCK_RAW),允許程序使用低層協(xié)議;protocol通常賦值"0"。Socket()調(diào)用返回一個(gè)整型socket描述符,你可以在后面的調(diào)用使用它。Socket描述符是一個(gè)指向內(nèi)部數(shù)據(jù)結(jié)構(gòu)的指針,它指向描述符表入口。調(diào)用Socket函數(shù)時(shí),socket執(zhí)行體將建立一個(gè)Socket,實(shí)際上"建立一個(gè)Socket"意味著為一個(gè)Socket數(shù)據(jù)結(jié)構(gòu)分配存儲(chǔ)空間。Socket執(zhí)行體為你管理描述符表。
4、兩個(gè)網(wǎng)絡(luò)程序之間的一個(gè)網(wǎng)絡(luò)連接包括五種信息:通信協(xié)議、本地協(xié)議地址、本地主機(jī)端口、遠(yuǎn)端主機(jī)地址和遠(yuǎn)端協(xié)議端口。Socket數(shù)據(jù)結(jié)構(gòu)中包含這五種信息。Socket配置通過(guò)socket調(diào)用返回一個(gè)socket描述符后,在使用socket進(jìn)行網(wǎng)絡(luò)傳輸以前,必須配置該socket。面向連接的socket客戶端通過(guò)調(diào)用Connect函數(shù)在socket數(shù)據(jù)結(jié)構(gòu)中保存本地和遠(yuǎn)端信息。無(wú)連接socket的客戶端和服務(wù)端以及面向連接socket的服務(wù)端通過(guò)調(diào)用bind函數(shù)來(lái)配置本地信息。Bind函數(shù)將socket與本機(jī)上的一個(gè)端口相關(guān)聯(lián),隨后你就可以在該端口監(jiān)聽(tīng)服務(wù)請(qǐng)求。Bind函數(shù)原型為:intbind(
5、intsockfd,structsockaddr*my_addr,intaddrlen);Sockfd是調(diào)用socket函數(shù)返回的socket描述符,my_addr是一個(gè)指向包含有本機(jī)IP地址及端口號(hào)等信息的sockaddr類型的指針;addrlen常被設(shè)置為sizeof(structsockaddr)。structsockaddr結(jié)構(gòu)類型是用來(lái)保存socket信息的:structsockaddr{unsignedshortsa_family;/*地址族,AF_xxx*/charsa_data[14];/*14字節(jié)的協(xié)議地址*/};sa_family一般為AF_INET,代表Interne
6、t(TCP/IP)地址族;sa_data則包含該socket的IP地址和端口號(hào)。另外還有一種結(jié)構(gòu)類型:structsockaddr_in{shortintsin_family;/*地址族*/unsignedshortintsin_port;/*端口號(hào)*/structin_addrsin_addr;/*IP地址*/unsignedcharsin_zero[8];/*填充0以保持與structsockaddr同樣大小*/};這個(gè)結(jié)構(gòu)更方便使用。sin_zero用來(lái)將sockaddr_in結(jié)構(gòu)填充到與structsockaddr同樣的長(zhǎng)度,可以用bzero()或memset()函數(shù)將其置為零。指
7、向sockaddr_in的指針和指向sockaddr的指針可以相互轉(zhuǎn)換,這意味著如果一個(gè)函數(shù)所需參數(shù)類型是sockaddr時(shí),你可以在函數(shù)調(diào)用的時(shí)候?qū)⒁粋€(gè)指向sockaddr_in的指針轉(zhuǎn)換為指向sockaddr的指針;或者相反。使用bind函數(shù)時(shí),可以用下面的賦值實(shí)現(xiàn)自動(dòng)獲得本機(jī)IP地址和隨機(jī)獲取一個(gè)沒(méi)有被占用的端口號(hào):my_addr.sin_port=0;/*系統(tǒng)隨機(jī)選擇一個(gè)未被使用的端口號(hào)*/my_addr.sin