socket編程原理_第1頁
已閱讀1頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Socket編程原理編程原理什么是SocketSocket接口是TCPIP網絡的API,Socket接口定義了許多函數或例程,程序員可以用它們來開發(fā)TCPIP網絡上的應用程序。要學Inter上的TCPIP網絡編程,必須理解Socket接口。Socket接口設計者最先是將接口放在Unix操作系統(tǒng)里面的。如果了解Unix系統(tǒng)的輸入和輸出的話,就很容易了解Socket了。網絡的Socket數據傳輸是一種特殊的IO,Socket也是一種文件描述

2、符。Socket也具有一個類似于打開文件的函數調用Socket(),該函數返回一個整型的Socket描述符,隨后的連接建立、數據傳輸等操作都是通過該Socket實現的。常用的Socket類型有兩種:流式Socket(SOCK_STREAM)和數據報式Socket(SOCK_DGRAM)。流式是一種面向連接的Socket,針對于面向連接的TCP服務應用;數據報式Socket是一種無連接的Socket,對應于無連接的UDP服務應用。Sock

3、et建立為了建立Socket,程序可以調用Socket函數,該函數返回一個類似于文件描述符的句柄。socket函數原型為:intsocket(intdomaininttypeintprotocol)domain指明所使用的協議族,通常為PF_I,表示互聯網協議族(TCPIP協議族);type參數指定socket的類型:SOCK_STREAM或SOCK_DGRAM,Socket接口還定義了原始Socket(SOCK_RAW),允許程序使用

4、低層協議;protocol通常賦值“0“。Socket()調用返回一個整型socket描述符,你可以在后面的調用使用它。Socket描述符是一個指向內部數據結構的指針,它指向描述符表入口。調用Socket函數時,socket執(zhí)行體將建立一個Socket,實際上“建立一個Socket“意味著為一個Socket數據結構分配存儲空間。Socket執(zhí)行體為你管理描述符表。兩個網絡程序之間的一個網絡連接包括五種信息:通信協議、本地協議地址、本地主

5、機端口、遠端主機地址和遠端協議端口。Socket數據結構中包含這五種信息。Socket配置通過socket調用返回一個socket描述符后,在使用socket進行網絡傳輸以前,必須配置該socket。面向連接的socket客戶端通過調用Connect函數在socket數據結構中保存本地和遠端信息。無連接socket的客戶端和服務端以及面向連接socket的服務端通過調用bind函數來配置本地信息。Bind函數將socket與本機上的一個

6、端口相關聯,隨后你就可以在該端口監(jiān)聽服務請求。Bind函數原型為:intbind(intsockfdstructsockaddrmy_addrintaddrlen)Sockfd是調用socket函數返回的socket描述符my_addr是一個指向包含有本機IP地址及端口號等信息的sockaddr類型的指針;addrlen常被設置為sizeof(structsockaddr)。structsockaddr結構類型是用來保存socket信息

7、的:structsockaddrunsignedshtsa_family地址族,AF_xxxsa_data[14]14字節(jié)的協議地址sa_family一般為AF_I,代表Inter(TCPIP)地址族;sa_data則包含該socket的IP地址和端口號。Listen函數使socket處于被動的監(jiān)聽模式,并為該socket建立一個輸入數據隊列,將到達的服務請求保存在此隊列中,直到程序處理它們。intlisten(intsockfd,in

8、tbacklog)Sockfd是Socket系統(tǒng)調用返回的socket描述符;backlog指定在請求隊列中允許的最大請求數,進入的連接請求將在隊列中等待accept()它們(參考下文)。Backlog對隊列中等待服務的請求的數目進行了限制,大多數系統(tǒng)缺省值為20。如果一個服務請求到來時,輸入隊列已滿,該socket將拒絕連接請求,客戶將收到一個出錯信息。當出現錯誤時listen函數返回1,并置相應的errno錯誤碼。accept()函

9、數讓服務器接收客戶的連接請求。在建立好輸入隊列后,服務器就調用accept函數,然后睡眠并等待客戶的連接請求。intaccept(intsockfdvoidaddrintaddrlen)sockfd是被監(jiān)聽的socket描述符,addr通常是一個指向sockaddr_in變量的指針,該變量用來存放提出連接請求服務的主機的信息(某臺主機從某個端口發(fā)出該請求);addrten通常為一個指向值為sizeof(structsockaddr_in

10、)的整型指針變量。出現錯誤時accept函數返回1并置相應的errno值。首先,當accept函數監(jiān)視的socket收到連接請求時,socket執(zhí)行體將建立一個新的socket,執(zhí)行體將這個新socket和請求連接進程的地址聯系起來,收到服務請求的初始socket仍可以繼續(xù)在以前的socket上監(jiān)聽,同時可以在新的socket描述符上進行數據傳輸操作。數據傳輸Send()和recv()這兩個函數用于面向連接的socket上進行數據傳輸。

11、Send()函數原型為:intsend(intsockfdconstvoidmsgintlenintflags)Sockfd是你想用來傳輸數據的socket描述符;msg是一個指向要發(fā)送數據的指針;Len是以字節(jié)為單位的數據的長度;flags一般情況下置為0(關于該參數的用法可參照man手冊)。Send()函數返回實際上發(fā)送出的字節(jié)數,可能會少于你希望發(fā)送的數據。在程序中應該將send()的返回值與欲發(fā)送的字節(jié)數進行比較。當send()

12、返回值與len不匹配時,應該對這種情況進行處理。msg=“Hello!“intlenbytes_sent……len=strlen(msg)bytes_sent=send(sockfdmsglen0)……recv()函數原型為:intrecv(intsockfdvoidbufintlenunsignedintflags)Sockfd是接受數據的socket描述符;buf是存放接收數據的緩沖區(qū);len是緩沖的長度。Flags也被置為0。Re

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論