C 网络socket编程指南PPT课件_第1页
C 网络socket编程指南PPT课件_第2页
C 网络socket编程指南PPT课件_第3页
C 网络socket编程指南PPT课件_第4页
C 网络socket编程指南PPT课件_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

.,1,Socket,使用Win32API,.,2,一個網路通訊程式,.,3,什麼是Socket,凡是網路兩端互相連線傳送資料時的溝通介面就是socket,是一個網路系統的通訊函式庫,在任何作業系統中可以通用主要的5大函式:socket()電話bind()線路(第幾分機?)listen()準備好接聽(啟用鈴聲)connect()撥電話出去accept()對方接聽,.,4,Socket函式,指定通訊協定,.,5,socket()函式,intSOCKETsocket(intaf,inttype,intprotocol);af:位址資料族系(family),用不同方式表示網路位址type:通訊方式Protocal:傳輸協定編號回傳值:-1表示建立socket發生錯誤若成功則回傳非負整數,稱為socketdescriptor(socket描述子),.,6,選項設定,af:選擇AF_INETInternetaddressfamily對應的網路位址資料格式是unsignedlong(無號長整數)type:SOCK_STREAM虛擬路徑連接方式(TCP用)SOCK_DGRAM資料包方傳遞式(UDP用)protocal:選擇IPPROTO_TCP(TCP通訊協定)或寫入0,交由系統設定,.,7,範例,SOCKETsock;/宣告sock=socket(/設定AF_INET,SOCK_STREAM,IPPROTO_TCP);,.,8,Bind函式,指定本地端位置,.,9,Bind()函式,intbind(SOCKETs,conststructsockaddr*name,intnamelen);s:指定好通訊協定的socketname:指定本地端位址,資料格式為sockaddrnamelen:name之資料長度(單位byte)回傳值:-1表錯誤,否則為0,.,10,Sockaddr_in格式(IPv4用),structsockaddr_inshortsin_family;u_shortsin_port;structin_addrsin_addr;charsin_zero8;sin_family:位址資料族系,同樣設定為AF_INETsin_port:主機開啟的通訊埠號用htons()寫入sin_addr:主機IP位址in_addr資料格式sin_zero8:目前沒用處,保留以後使用,.,11,in_addr格式,typedefstructin_addrunionstructu_chars_b1,s_b2,s_b3,s_b4;S_un_b;structu_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,.,12,範例,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*),.,13,Listen函式設定socket等待外部連線,listen()是使Socket進入等待連線狀態,等待客戶端(Client)連上線來,很顯然的呼叫此函式的主機,功能會是一台伺服器(Server)。如果有Client想要連過來,此時可以呼叫connect()來跟Server連線。而Server接受後會建立新的socket和Client通訊,listensocket則繼續存在等待其他Client,直到關閉為止。,.,14,listen()函式,intlisten(SOCKETs,intbacklog);s:設定好bind(),並且尚未連線的socketBacklog:等待Server接受連線前,同時最大連線數回傳值:-1表錯誤,否則為0,.,15,Accept函式接受外部連線,BlockingNon-blocking,.,16,Accept()函式,SOCKETaccept(SOCKETs,structsockaddr*addr,int*addrlen);s:一個設定為listen狀態的socketsddr:Client端位址資訊,由函式自動產生填入addrlen:sddr長度,由函式自動產生回傳值:-1表示錯誤,否則傳回另一個包含Client端資訊的新socketdescriptor,作為傳送資料用傳進accept()的listensocket本身並沒有辦法作資料的傳輸,所以必須透過accept()產生一個包含通訊協定、Server、Client資訊的新socket,利用他就可以進行資料的傳輸了,.,17,範例,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;,.,18,connect函式與等待接聽的socket連線,Client端若要與Server溝通,必須透過connect建立連線,經過驗證確定連線成功後,才能進行資料傳輸。三向交握(three-wayhandshake)機制:1.Client向Server提出連線要求(connect()2.Server若接到要求,則回應Clinet接到要求3.Client接到回應,向Server表示收到回覆至此才算連線建立完成,雙方可以開始交換資料若發生錯誤,則會由轉送中繼站回傳ICMP錯誤訊息connect函式讀到後,會回報錯誤給程式,.,19,connect()函式,intconnect(SOCKETs,conststructsockaddr*name,intnamelen);設定方式請參照bind()函式name內資料為回傳值:-1表錯誤,否則回傳0,.,20,recv(),send()函式處理資料收送,從先前設定好Server與Client的通訊方式後,我們利用進行資料交換的函式recv(),send()來處理要溝通的資料,其實資料溝通的函式有許多種類,read(),write(),readv(),writev(),recvmsg(),sendmsg()等等,我們介紹recv()和send()給大家入門,其他函式的使用可以查閱MSDN或man說明文件,.,21,recv()函式,intrecv(SOCKETs,char*buf,intlen,intflags);s:一個建立連線成功的socketbuf:呼叫recv,用來儲存收到資料的暫存器len:buf的長度(byte)flags:選擇工作模式,一般填入0回傳值:-1表錯誤,否則傳回接受到資料的長度(byte),.,22,send()函式,intsend(SOCKETs,constchar*buf,intlen,intflags);s:一個建立連線成功的socketbuf:用來儲存將送出資料的暫存器len:buf的長度(byte)flags:選擇工作模式,一般填入0回傳值:-1表錯誤,否則傳回送出資料的長度(byte),.,23,範例,/Server端intbytesSent;intbytesRecv=SOCKET_ERROR;charsendbuf32=Server:SendingData.;charrecvbuf32=;bytesRecv=recv(m_socket,recvbuf,32,0);printf(BytesRecv:%ldn,bytesRecv);bytesSent=send(m_socket,sendbuf,strlen(sendbuf),0);printf(BytesSent:%ldn,bytesSent);/Client端intbytesSent;intbytesRecv=SOCKET_ERROR;charsendbuf32=Client:Sendingdata.;charrecvbuf32=;bytesSent=send(m_socket,sendbuf,strlen(sendbuf),0);printf(BytesSent:%ldn,bytesSent);while(bytesRecv=SOCKET_ERROR)bytesRecv=recv(m_socket,recvbuf,32,0);if(bytesRecv=0|bytesRecv=WSAECONNRESET)printf(ConnectionClosed.n);break;if(bytesRecvItems-Add()新增資料或是ListBox1-Items-Insert()插入資料Add(字串),Insert(位置,字串)由於本次Server端只用到這一個元件,直接拉到滿版,.,31,Server端用到的元件,Timer計時器等待,定時輪詢,.,32,Server端用到的語法,#defineAB定義A為B,如利用#defineAdd(Text)ListBox1-Items-Insert(0,Text)這樣就可以用簡短的Add(“文字”)指令取代一長串的Insert指令註:#define只會增加編譯時間(要轉換),對於程式的實際效能毫無影響,.,33,Server端的工作流程,程式啟動直接開始監聽工作WS

温馨提示

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

评论

0/150

提交评论