C++網(wǎng)絡(luò)socket編程指南_第1頁
C++網(wǎng)絡(luò)socket編程指南_第2頁
C++網(wǎng)絡(luò)socket編程指南_第3頁
C++網(wǎng)絡(luò)socket編程指南_第4頁
C++網(wǎng)絡(luò)socket編程指南_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

Socket使用Win32API1精選課件一個網(wǎng)路通訊程式2精選課件什麼是Socket凡是網(wǎng)路兩端互相連線傳送資料時的溝通介面就是socket,是一個網(wǎng)路系統(tǒng)的通訊函式庫,在任何作業(yè)系統(tǒng)中可以通用 主要的5大函式: socket()電話 bind()線路(第幾分機?) listen()準備好接聽(啟用鈴聲) connect()撥電話出去 accept()對方接聽3精選課件Socket函式,指定通訊協(xié)定4精選課件socket()函式intSOCKET

socket(

int

af, int

type, int

protocol

);

af:位址資料族系(family),用不同方式表示網(wǎng)路位址type:通訊方式Protocal:傳輸協(xié)定編號回傳值:-1表示建立socket發(fā)生錯誤 若成功則回傳非負整數(shù),稱為socketdescriptor (socket描述子)5精選課件選項設(shè)定af:選擇AF_INET Internetaddressfamily 對應的網(wǎng)路位址資料格式是 unsignedlong(無號長整數(shù))type:SOCK_STREAM虛擬路徑連接方式(TCP用) SOCK_DGRAM資料包方傳遞式(UDP用)protocal: 選擇IPPROTO_TCP(TCP通訊協(xié)定)

或?qū)懭?,交由系統(tǒng)設(shè)定

6精選課件範例SOCKETsock; //宣告sock=socket( //設(shè)定 AF_INET, SOCK_STREAM, IPPROTO_TCP);7精選課件Bind函式,指定本地端位置8精選課件Bind()函式int

bind( SOCKET

s, conststructsockaddr*

name, int

namelen

);s:指定好通訊協(xié)定的socketname:指定本地端位址,資料格式為sockaddrnamelen:name之資料長度(單位byte)回傳值:-1表錯誤,否則為09精選課件Sockaddr_in格式(IPv4用)structsockaddr_in{

shortsin_family;

u_shortsin_port; structin_addrsin_addr; charsin_zero[8];};sin_family:位址資料族系,同樣設(shè)定為AF_INETsin_port:主機開啟的通訊埠號用htons()寫入sin_addr:主機IP位址in_addr資料格式sin_zero[8]:目前沒用處,保留以後使用10精選課件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的結(jié)構(gòu)體,實際上的大小是一個32bit的長整數(shù)所以只要注意u_longS_addr這個變數(shù)將IP對此變數(shù)寫入便可函式庫引入的標頭檔應該會有定義#defines_addrS_un.s_addr此後只要對前一頁之變數(shù)sin_addr.s_addr存取便可寫入時使用inet_addr(“IP位址字串”)轉(zhuǎn)換成unsignedlong11精選課件範例SOCKETSock;sockaddr_insaServer;Sock=socket( AF_INET, SOCK_STREAM, IPPROTO_TCP);//設(shè)定本機通訊用的位址saServer.sin_family=AF_INET;saServer.sin_port=htons(5150); //啟用5150portsaServer.sin_addr.s_addr=inet_addr(“140.115.65.30”);//設(shè)定本機IP//呼叫Bind函式

bind(Sock,(SOCKADDR*)&saServer,sizeof(saServer));12精選課件Listen函式設(shè)定socket等待外部連線

listen()是使Socket進入等待連線狀態(tài),等待客戶端(Client)連上線來,很顯然的呼叫此函式的主機,功能會是一臺伺服器(Server)。 如果有Client想要連過來,此時可以呼叫connect()來跟Server連線。而Server接受後會建立新的socket和Client通訊,listensocket則繼續(xù)存在等待其他Client,直到關(guān)閉為止。13精選課件

listen()函式int

listen(

SOCKET

s, int

backlog

);

s:設(shè)定好bind(),並且尚未連線的socketBacklog:等待Server接受連線前,同時最大連線數(shù)回傳值:-1表錯誤,否則為014精選課件Accept函式接受外部連線BlockingNon-blocking15精選課件Accept()函式SOCKET

accept(

SOCKET

s, structsockaddr*

addr, int*

addrlen

);

s:一個設(shè)定為listen狀態(tài)的socketsddr:Client端位址資訊,由函式自動產(chǎn)生填入addrlen:sddr長度,由函式自動產(chǎn)生回傳值:-1表示錯誤,否則傳回另一個包含Client端資訊的新socket descriptor,作為傳送資料用 傳進accept()的listensocket本身並沒有辦法作資料的傳輸,所以必須透過accept()產(chǎn)生一個包含通訊協(xié)定、Server、Client資訊的新socket,利用他就可以進行資料的傳輸了16精選課件範例ListenSocket為一個bind()過且未連線的socket//設(shè)定socket為接聽外部連線用if(listen(ListenSocket,1)==SOCKET_ERROR)printf("Errorlisteningonsocket.\n");//宣告一個用來和Client連線用的socketSOCKETAcceptSocket;//接受外部連線while(1){ AcceptSocket=SOCKET_ERROR; //尚未取得socketdescriptor,等待外部連線進入時重設(shè) while(AcceptSocket==SOCKET_ERROR){ AcceptSocket=accept(ListenSocket,NULL,NULL); } printf("Clientconnected.\n"); break;}17精選課件connect函式與等待接聽的socket連線

Client端若要與Server溝通,必須透過connect建立連線,經(jīng)過驗證確定連線成功後,才能進行資料傳輸。 三向交握(three-wayhandshake)機制: 1.Client向Server提出連線要求(connect()) 2.Server若接到要求,則回應Clinet接到要求 3.Client接到回應,向Server表示收到回覆 至此才算連線建立完成,雙方可以開始交換資料 若發(fā)生錯誤,則會由轉(zhuǎn)送中繼站回傳ICMP錯誤訊息 connect函式讀到後,會回報錯誤給程式18精選課件connect()函式

int

connect(

SOCKET

s, conststructsockaddr*

name, int

namelen

);

設(shè)定方式請參照bind()函式 name內(nèi)資料為 回傳值:-1表錯誤,否則回傳019精選課件recv(),send()函式處理資料收送 從先前設(shè)定好Server與Client的通訊方式後,我們利用進行資料交換的函式recv(),send()來處理要溝通的資料,其實資料溝通的函式有許多種類,read(), write(),readv(),writev(),recvmsg(), sendmsg()等等,我們介紹recv()和send()給大家入門,其他函式的使用可以查閱MSDN或man說明文件20精選課件recv()函式

int

recv(

SOCKET

s, char*

buf, int

len, int

flags

);

s:一個建立連線成功的socket

buf:呼叫recv,用來儲存收到資料的暫存器

len:buf的長度(byte)

flags:選擇工作模式,一般填入0 回傳值:-1表錯誤,否則傳回接受到資料的長度(byte)21精選課件send()函式 int

send(

SOCKET

s, constchar*

buf, int

len, int

flags);

s:一個建立連線成功的socket

buf:用來儲存將送出資料的暫存器

len:buf的長度(byte)

flags:選擇工作模式,一般填入0 回傳值:-1表錯誤,否則傳回送出資料的長度(byte)22精選課件範例 //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); }23精選課件closesocket(),shutdown()函式中斷連線

在accept()或connect()成功後建立的通訊用socket,必須由Client或Server下達closesocket()或shutdown()來結(jié)束連線。 closesocket()可以用來終止TCP連線,但不會馬上關(guān)閉,必須等到該socket不在動作後才切斷連線,這和TCP協(xié)定中使用到的slidingwindow有關(guān),這是用完再關(guān)的函式,而shutdown()是有強制性質(zhì)的中斷連線函式,用來控制socket的IO。 一個好的中斷連線作法應有四步: 1.結(jié)束傳送資料 2.使用shutdown(),設(shè)定為禁止送出資料 3.呼叫recv(),確定收到的資料長度為0,避免遺漏資訊 4.closesocket()來關(guān)閉socket

註:在Winsock中使用的closesocket()和BSDsocket中的close()是相同的24精選課件closesocket()與shutdown()函式

int

closesocket(

SOCKET

s

);

int

shutdown(

SOCKET

s, int

how

);

s:使用中的socket

how:控制socket工作的方式 SD_RECEIVE禁止輸入(disablerecv()函式) SD_SEND禁止輸出(disablesend()函式) SD_BOTH雙向禁止 回傳值:-1表錯誤,否則傳回025精選課件Server-ClientModelrecv()send()26精選課件WINSOCKETS#include<winsock2.h>27精選課件WINSOCKETSWSADATAwsadata;if(WSAStartup(0x101,(LPWSADATA)&wsadata)!=0){fprintf(stderr,"echo_srv:can'tuseWinSockDLL\n"); exit(1); }28精選課件WINSOCKETS WSACleanup();29精

溫馨提示

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

評論

0/150

提交評論