C++网络socket编程指南ppt课件.ppt_第1页
C++网络socket编程指南ppt课件.ppt_第2页
C++网络socket编程指南ppt课件.ppt_第3页
C++网络socket编程指南ppt课件.ppt_第4页
C++网络socket编程指南ppt课件.ppt_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Socket 使用Win32API 一個網路通訊程式 什麼是Socket 凡是網路兩端互相連線傳送資料時的溝通介面就是socket 是一個網路系統的通訊函式庫 在任何作業系統中可以通用主要的5大函式 socket 電話bind 線路 第幾分機 listen 準備好接聽 啟用鈴聲 connect 撥電話出去accept 對方接聽 Socket函式 指定通訊協定 socket 函式 intSOCKETsocket intaf inttype intprotocol af 位址資料族系 family 用不同方式表示網路位址type 通訊方式Protocal 傳輸協定編號回傳值 1表示建立socket發生錯誤若成功則回傳非負整數 稱為socketdescriptor socket描述子 選項設定 af 選擇AF INET Internetaddressfamily對應的網路位址資料格式是unsignedlong 無號長整數 type SOCK STREAM虛擬路徑連接方式 TCP用 SOCK DGRAM資料包方傳遞式 UDP用 protocal 選擇IPPROTO TCP TCP通訊協定 或寫入0 交由系統設定 範例 SOCKETsock 宣告sock socket 設定AF INET SOCK STREAM IPPROTO TCP Bind函式 指定本地端位置 Bind 函式 intbind SOCKETs conststructsockaddr name intnamelen s 指定好通訊協定的socketname 指定本地端位址 資料格式為sockaddrnamelen name之資料長度 單位byte 回傳值 1表錯誤 否則為0 Sockaddr in格式 IPv4用 structsockaddr in shortsin family u shortsin port structin addrsin addr charsin zero 8 sin family 位址資料族系 同樣設定為AF INETsin port 主機開啟的通訊埠號用htons 寫入sin addr 主機IP位址in addr資料格式sin zero 8 目前沒用處 保留以後使用 in addr格式 typedefstructin addr union struct u chars b1 s b2 s b3 s b4 S un b struct u shorts w1 s w2 S un w u longS addr S un in addr 使用了union的結構體 實際上的大小是一個32bit的長整數所以只要注意u longS addr這個變數將IP對此變數寫入便可函式庫引入的標頭檔應該會有定義 defines addrS un s addr此後只要對前一頁之變數sin addr s addr存取便可寫入時使用inet addr IP位址字串 轉換成unsignedlong 範例 SOCKETSock sockaddr insaServer Sock socket AF INET SOCK STREAM IPPROTO TCP 設定本機通訊用的位址saServer sin family AF INET saServer sin port htons 5150 啟用5150portsaServer sin addr s addr inet addr 140 115 65 30 設定本機IP 呼叫Bind函式bind Sock SOCKADDR Listen函式設定socket等待外部連線 listen 是使Socket進入等待連線狀態 等待客戶端 Client 連上線來 很顯然的呼叫此函式的主機 功能會是一台伺服器 Server 如果有Client想要連過來 此時可以呼叫connect 來跟Server連線 而Server接受後會建立新的socket和Client通訊 listensocket則繼續存在等待其他Client 直到關閉為止 listen 函式 intlisten SOCKETs intbacklog s 設定好bind 並且尚未連線的socketBacklog 等待Server接受連線前 同時最大連線數回傳值 1表錯誤 否則為0 Accept函式接受外部連線 BlockingNon blocking Accept 函式 SOCKETaccept SOCKETs structsockaddr addr int addrlen s 一個設定為listen狀態的socketsddr Client端位址資訊 由函式自動產生填入addrlen sddr長度 由函式自動產生回傳值 1表示錯誤 否則傳回另一個包含Client端資訊的新socketdescriptor 作為傳送資料用傳進accept 的listensocket本身並沒有辦法作資料的傳輸 所以必須透過accept 產生一個包含通訊協定 Server Client資訊的新socket 利用他就可以進行資料的傳輸了 範例 ListenSocket為一個bind 過且未連線的socket 設定socket為接聽外部連線用if listen ListenSocket 1 SOCKET ERROR printf Errorlisteningonsocket n 宣告一個用來和Client連線用的socketSOCKETAcceptSocket 接受外部連線while 1 AcceptSocket SOCKET ERROR 尚未取得socketdescriptor 等待外部連線進入時重設while AcceptSocket SOCKET ERROR AcceptSocket accept ListenSocket NULL NULL printf Clientconnected n break connect函式與等待接聽的socket連線 Client端若要與Server溝通 必須透過connect建立連線 經過驗證確定連線成功後 才能進行資料傳輸 三向交握 three wayhandshake 機制 1 Client向Server提出連線要求 connect 2 Server若接到要求 則回應Clinet接到要求3 Client接到回應 向Server表示收到回覆至此才算連線建立完成 雙方可以開始交換資料若發生錯誤 則會由轉送中繼站回傳ICMP錯誤訊息connect函式讀到後 會回報錯誤給程式 connect 函式 intconnect SOCKETs conststructsockaddr name intnamelen 設定方式請參照bind 函式name內資料為回傳值 1表錯誤 否則回傳0 recv send 函式處理資料收送 從先前設定好Server與Client的通訊方式後 我們利用進行資料交換的函式recv send 來處理要溝通的資料 其實資料溝通的函式有許多種類 read write readv writev recvmsg sendmsg 等等 我們介紹recv 和send 給大家入門 其他函式的使用可以查閱MSDN或man說明文件 recv 函式 intrecv SOCKETs char buf intlen intflags s 一個建立連線成功的socketbuf 呼叫recv 用來儲存收到資料的暫存器len buf的長度 byte flags 選擇工作模式 一般填入0回傳值 1表錯誤 否則傳回接受到資料的長度 byte send 函式 intsend SOCKETs constchar buf intlen intflags s 一個建立連線成功的socketbuf 用來儲存將送出資料的暫存器len buf的長度 byte flags 選擇工作模式 一般填入0回傳值 1表錯誤 否則傳回送出資料的長度 byte 範例 Server端intbytesSent intbytesRecv SOCKET ERROR charsendbuf 32 Server SendingData charrecvbuf 32 bytesRecv recv m socket recvbuf 32 0 printf BytesRecv ld n bytesRecv bytesSent send m socket sendbuf strlen sendbuf 0 printf BytesSent ld n bytesSent Client端intbytesSent intbytesRecv SOCKET ERROR charsendbuf 32 Client Sendingdata charrecvbuf 32 bytesSent send m socket sendbuf strlen sendbuf 0 printf BytesSent ld n bytesSent while bytesRecv SOCKET ERROR bytesRecv recv m socket recvbuf 32 0 if bytesRecv 0 bytesRecv WSAECONNRESET printf ConnectionClosed n break if bytesRecv 0 return printf BytesRecv ld n bytesRecv closesocket shutdown 函式中斷連線 在accept 或connect 成功後建立的通訊用socket 必須由Client或Server下達closesocket 或shutdown 來結束連線 closesocket 可以用來終止TCP連線 但不會馬上關閉 必須等到該socket不在動作後才切斷連線 這和TCP協定中使用到的slidingwindow有關 這是用完再關的函式 而shutdown 是有強制性質的中斷連線函式 用來控制socket的IO 一個好的中斷連線作法應有四步 1 結束傳送資料2 使用shutdown 設定為禁止送出資料3 呼叫recv 確定收到的資料長度為0 避免遺漏資訊4 closesocket 來關閉socket註 在Winsock中使用的closesocket 和BSDsocket中的close 是相同的 closesocket 與shutdown 函式 intclosesocket SOCKETs intshutdown SOCKETs inthow s 使用中的sockethow 控制socket工作的方式SD RECEIVE禁止輸入 disablerecv 函式 SD SEND禁止輸出 disablesend 函式 SD BOTH雙向禁止回傳值 1表錯誤 否則傳回0 Server ClientModel recv send WINSOCKETS include WINSOCKETS WSADATAwsadata if WSAStartup 0 x101 LPWSADATA WINSOCKETS WSACleanup Server端用到的元件 ListBox 顯示項目清單可以利用ListBox1 Items Add 新增資料或是ListBox1 Items Insert 插入資料Add 字串 Insert 位置 字串 由於本次Server端只用到這一個元件 直接拉到滿版 Server端用到的元件 Timer 計時器等待 定時輪詢 Server端用到的語法 defineAB定義A為B 如利用 defineAdd Text ListBox1 Items Insert 0 Text 這樣就可以用簡短的Add 文字 指令取代一長串的Insert指令註 define只會增加編譯時間 要轉換 對於程式的實際效能毫無影響 Server端的工作流程 程式啟動直接開始監聽

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论