資源描述:
《linux環(huán)境下的socket編程》由會員上傳分享,免費在線閱讀,更多相關內容在教育資源-天天文庫。
1、Linux環(huán)境下的Socket編程來源:Linux技術中堅站等級:默認等級發(fā)布于2005-05-2817:56被讀380758次【字體:大中小】什么是Socket Socket接口是TCP/IP網絡的API,Socket接口定義了許多函數或例程,程序員可以用它們來開發(fā)TCP/IP網絡上的應用程序。要學Internet上的TCP/IP網絡編程,必須理解Socket接口?! ocket接口設計者最先是將接口放在Unix操作系統(tǒng)里面的。如果了解Unix系統(tǒng)的輸入和輸出的話,就很容易了解Socket了。網絡的Socket數據傳輸是一種特殊的I/
2、O,Socket也是一種文件描述符。Socket也具有一個類似于打開文件的函數調用Socket(),該函數返回一個整型的Socket描述符,隨后的連接建立、數據傳輸等操作都是通過該Socket實現的。常用的Socket類型有兩種:流式Socket(SOCK_STREAM)和數據報式Socket(SOCK_DGRAM)。流式是一種面向連接的Socket,針對于面向連接的TCP服務應用;數據報式Socket是一種無連接的Socket,對應于無連接的UDP服務應用。Socket建立 為了建立Socket,程序可以調用Socket函數,該函數返回
3、一個類似于文件描述符的句柄。socket函數原型為: intsocket(intdomain,inttype,intprotocol); domain指明所使用的協(xié)議族,通常為PF_INET,表示互聯(lián)網協(xié)議族(TCP/IP協(xié)議族);type參數指定socket的類型:SOCK_STREAM或SOCK_DGRAM,Socket接口還定義了原始Socket(SOCK_RAW),允許程序使用低層協(xié)議;protocol通常賦值"0"。Socket()調用返回一個整型socket描述符,你可以在后面的調用使用它。 Socket描述符是一個指向內
4、部數據結構的指針,它指向描述符表入口。調用Socket函數時,socket執(zhí)行體將建立一個Socket,實際上"建立一個Socket"意味著為一個Socket數據結構分配存儲空間。Socket執(zhí)行體為你管理描述符表?! 蓚€網絡程序之間的一個網絡連接包括五種信息:通信協(xié)議、本地協(xié)議地址、本地主機端口、遠端主機地址和遠端協(xié)議端口。Socket數據結構中包含這五種信息。Socket配置 通過socket調用返回一個socket描述符后,在使用socket進行網絡傳輸以前,必須配置該socket。面向連接的socket客戶端通過調用Connec
5、t函數在socket數據結構中保存本地和遠端信息。無連接socket的客戶端和服務端以及面向連接socket的服務端通過調用bind函數來配置本地信息。Bind函數將socket與本機上的一個端口相關聯(lián),隨后你就可以在該端口監(jiān)聽服務請求。Bind函數原型為: intbind(intsockfd,structsockaddr*my_addr,intaddrlen); Sockfd是調用socket函數返回的socket描述符,my_addr是一個指向包含有本機IP地址及端口號等信息的sockaddr類型的指針;addrlen常被設置為si
6、zeof(structsockaddr)。 structsockaddr結構類型是用來保存socket信息的: structsockaddr{ unsignedshortsa_family;/*地址族,AF_xxx*/charsa_data[14];/*14字節(jié)的協(xié)議地址*/}; sa_family一般為AF_INET,代表Internet(TCP/IP)地址族;sa_data則包含該socket的IP地址和端口號?! ×硗膺€有一種結構類型: structsockaddr_in{ shortintsin_family;/*地址族
7、*/ unsignedshortintsin_port;/*端口號*/ structin_addrsin_addr;/*IP地址*/ unsignedcharsin_zero[8];/*填充0以保持與structsockaddr同樣大小*/ }; 這個結構更方便使用。sin_zero用來將sockaddr_in結構填充到與structsockaddr同樣的長度,可以用bzero()或memset()函數將其置為零。指向sockaddr_in的指針和指向sockaddr的指針可以相互轉換,這意味著如果一個函數所需參數類型是socka
8、ddr時,你可以在函數調用的時候將一個指向sockaddr_in的指針轉換為指向sockaddr的指針;或者相反?! ∈褂胋ind函數時,可以用下面的賦值實現自動獲得本機IP地址