網(wǎng)絡軟件設計1.3——套接字接口函數(shù)_第1頁
網(wǎng)絡軟件設計1.3——套接字接口函數(shù)_第2頁
網(wǎng)絡軟件設計1.3——套接字接口函數(shù)_第3頁
網(wǎng)絡軟件設計1.3——套接字接口函數(shù)_第4頁
網(wǎng)絡軟件設計1.3——套接字接口函數(shù)_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、網(wǎng)絡軟件設計套接字接口函數(shù)2socket 函數(shù)調(diào)用socket( )bind( )listen( )accept( )recv( )send( )closesocket( )recvfrom( )sendto( )connect( )select( )setsockopt( )ioctlsocket( )shutdown( )通信類控制類getpeername( )getsockname( )getsockopt( )信息類htonl( )htons( )ntohl( )ntohs( )inet_addr( )inet_ntoa( )輔助類3socket ( )SOCKET WSAAPI so

2、cket( IN int af, IN int type, IN int protocol)SOCKET類型就是int 類型(見winsock.h 中的定義)WSAAPI:說明函數(shù)是Windows Socket Application Application Programming Interface函數(shù)IN:表示參數(shù)的作用是輸入OUT:表示參數(shù)作用為輸出4SOCKET socket( IN int af, IN int type, IN int protocol)af:地址族類型,tcp/ip使用AF_INETsocket ( )type:套接字類型,SOCK_STREAMSOCK_DGRA

3、MSOCK_RAWSOCK_RDMSOCK_SEQPAKCET默認情況下使用TCP協(xié)議默認情況下使用UDP協(xié)議數(shù)據(jù)直接封裝在IP分組內(nèi)功能:建立一個套接口結構,將其描述符交給調(diào)用者protocol:協(xié)議號,一般設置為0返回:套接字描述符實驗:測試socket()的各個參數(shù),如使用非常規(guī)的af,type,protocol來測試5bind ( )int bind ( IN SOCKET s, IN struct sockaddr * name, IN int namelen)s: 套接字描述符name:本地端點(套接字)地址結構指針namelen:本地端點(套接字)地址結構大小功能:建立套接字和端

4、點之間的關系確定“我是誰”返回:正確建立為0,否則為SOCKET_ERROR實驗:能否在一個套接字描述符上兩次綁定不同端點 能否在不同的套接字上綁定同一個端點6listen ( )int listen(IN SOCKET s,IN int backlog)s: 套接字描述符backlog: 設置同時監(jiān)聽的連接個數(shù),最好不設置為0, 目前最大為5功能:設置套接字為監(jiān)聽模式。服務器模式返回:設置成功為0,否則為SOCKET_ERROR實驗:如何通過backlog來限制同時接收的連接個數(shù)設計實驗方案,預期的結果(1)7connect ( )int connet(IN SOCKET s,IN stru

5、ct sockaddr * name, IN int namelen)s: 套接字描述符name:端點(套接字)地址結構指針namelen:端點(套接字)地址結構大小功能:與服務器建立連接返回:連接成功為0,不成功為1實驗:服務器的地址可以是INADDR_ANY嗎?為什么? 連接前一定要綁定本地端點嗎?8accept ( )SOCKET accept( IN SOCKET s, OUT struct sockaddr * addr, IN OUT int * addrlen )addr:遠端點(套接字)地址結構指針addrlen:遠端點(套接字)地址結構大小指針s: 套接字描述符功能:接受一個

6、對方調(diào)用connect()請求的連接。該連接將在返回的新套接字上完成返回:連接所在的新套接字描述符,不成功則為1輸出:addr 遠端點地址addrlen 遠端點地址結構大小實驗:addr在調(diào)用前是否一定要填入內(nèi)容,addrlen呢?思考:客戶認為已建立連接是在之前還是之后?9recv ( )int recv( IN SOCKET s, OUT char * buf, IN int len, IN int flags)s: 套接字描述符buf:接收緩沖區(qū)的指針len:接收緩沖區(qū)大小思考:為什么要設置lenflags:接收方式,一般為0。MSG_OOB:讀取帶外數(shù)據(jù)MSG_PEEK:數(shù)據(jù)不從隊列中

7、取出實驗:MSG_PEEK的作用功能:從套接字接收數(shù)據(jù),數(shù)據(jù)將放在buf所指的緩沖區(qū)內(nèi)。通過返回值,調(diào)用者可以獲得真正接收的字節(jié)數(shù)。返回:接收的字節(jié)數(shù)輸出:buf緩沖區(qū)內(nèi)將填入接收的數(shù)據(jù)10send ( )int send( IN SOCKET s, IN char * buf, IN int len, IN int flags)s: 套接字描述符buf:發(fā)送緩沖區(qū)的指針len:發(fā)送的字節(jié)數(shù)flags:發(fā)送方式,一般為0。功能:從套接字發(fā)送數(shù)據(jù),用戶事先準備好數(shù)據(jù),放在buf里。返回:真正發(fā)送的字節(jié)數(shù)思考:len的作用,和recv中的len有什么區(qū)別MSG_OOB:發(fā)送帶外數(shù)據(jù)MSG_DONT

8、ROUTE:數(shù)據(jù)外送時,不做路由選擇11recvfrom ( )int recvfrom( IN SOCKET s, OUT char * buf, IN int len, IN int flags, OUT struct sockaddr * from, IN OUT int * fromlen)s: 套接字描述符buf:接收緩沖區(qū)的指針len:接收緩沖區(qū)大小flags:接收方式,一般為0。from:遠端點結構指針fromlen:遠端點結構大小指針功能:在套接字接收數(shù)據(jù),并捕獲發(fā)送遠端點地址。返回:接收的字節(jié)數(shù)輸出:buf緩沖區(qū)內(nèi)將填入接收的數(shù)據(jù)from中將填入遠端點信息fromlen中將填

9、入遠端點結構大小思考:和recv有什么區(qū)別12sendto ( )int sendto( IN SOCKET s, IN char * buf , IN int len, IN int flags, IN struct sockaddr * to, IN int tolen)s: 套接字描述符buf:發(fā)送緩沖區(qū)的指針len:發(fā)送的字節(jié)數(shù)flags:發(fā)送方式,一般為0。功能:從套接字發(fā)送數(shù)據(jù),用戶事先準備好數(shù)據(jù),放在buf里。to:遠端點地址結構指針tolen:遠端點地址結構大小返回:真正發(fā)送的字節(jié)數(shù)思考:與send的區(qū)別在這些函數(shù)中為什么有些時候端點地址結構大小傳值而有些時候傳指針?13shu

10、tdown ( )int shutdown( IN SOCKET s, IN int how)s: 套接字描述符how:斷開連接方式功能:可以三種方式斷開連接how為0(SD_RECEIVE): 套接字不再提供接收數(shù)據(jù)服務how為1(SD_SEND): 套接字不再提供發(fā)送數(shù)據(jù)服務how為2(SD_BOTH): 套接字不再提供接收數(shù)據(jù)和發(fā)送注意,這將發(fā)出一個FIN數(shù)據(jù)服務返回:正確執(zhí)行為0, 否則為1實驗:三種方式下的效果。14closesocket ( )int closesocket( IN SOCKET s)s: 套接字描述符功能:關閉套接字,如果套接字上有連接,則連接也關閉了返回:成功為

11、0。思考:closesocket與shutdown的區(qū)別,本質(zhì)區(qū)別小結以套接字為主關鍵參數(shù)所有的通信類和控制類函數(shù)關于地址結構長度參數(shù)有時候是形參,有時是實參有時是整型變量,有時是整型指針有時是輸入,有時是輸出,有時是輸入和輸出關于套接字函數(shù)返回值的處理通信程序是需要雙方配合的,如果對方?jīng)]有按照預想的配合,應該有應對措施。應對措施之一,依靠函數(shù)錯誤返回值,避免自己的流程以錯誤的姿態(tài)進入1516關于錯誤處理套接字函數(shù)的返回值中,為0多數(shù)表示為成功執(zhí)行 為1表示錯誤(SOCKET_ERROR)在windows系統(tǒng)下,也可通過WSAGetLastError()來取得進一步的出錯代號例:1if(bind(s,) = SOCKET_ERROR) error_num = WSAGetLastError( );當出錯以后,通過getsockopt()設置為SO_ERROR來獲得進一步的出錯代號if(bind(s,) = SOCKET_ERROR) getsockopt( s, SOL_SOCKET, SO_ERROR, &error_num, sizeof( error_num ) );例:2思考:獲得錯誤代碼以后,程序的處理模式17關于錯誤處理錯誤代碼:在winsock.h中查詢if(bin

溫馨提示

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

評論

0/150

提交評論