C++网络socket编程指南

上传人:仙*** 文档编号:243024816 上传时间:2024-09-14 格式:PPT 页数:35 大小:264KB
返回 下载 相关 举报
C++网络socket编程指南_第1页
第1页 / 共35页
C++网络socket编程指南_第2页
第2页 / 共35页
C++网络socket编程指南_第3页
第3页 / 共35页
点击查看更多>>
资源描述
按一下以編輯母片標題樣式,按一下以編輯母片,第二層,第三層,第四層,第五層,*,Socket,使用,Win32 API,一個網路通訊程式,什麼是,Socket,凡是網路兩端互相連線傳送資料時的溝通介面就是,socket,,是一個網路系統的通訊函式庫,在任何作,業系統中可以通用,主要的,5,大函式:,socket(),電話,bind() ,線路,(,第幾分機,?),listen() ,準備好接聽,(,啟用鈴聲,),connect() ,撥電話出去,accept() ,對方接聽,Socket,函式,指定通訊協定,socket,( ),函式,int,SOCKET,socket(,int,af,int,type,int,protocol,);,af,:位址資料族系,(family),,用不同方式表示網路位址,type,:通訊方式,Protocal,:傳輸協定編號,回傳值:,-1,表示建立,socket,發生錯誤,若成功則回傳非負整數,稱為,socket descriptor,(socket,描述子,),選項設定,af,:,選擇,AF_INET, Internet address family,對應的網路位址資料格式是,unsigned long(,無號長整數,),type,:,SOCK_STREAM,虛擬路徑連接方式,(TCP,用,),SOCK_DGRAM,資料包方傳遞式,(UDP,用,),protocal,:選擇,IPPROTO_TCP (TCP,通訊協定,),或寫入,0,,交由系統設定,範例,SOCKET sock;/,宣告,sock = socket(/,設定,AF_INET,SOCK_STREAM,IPPROTO_TCP,);,Bind,函式,指定本地端位置,Bind(),函式,int,bind(,SOCKET,s,const,struct,sockaddr,*,name,int,namelen,);,s,:,指定好通訊協定的,socket,name,:,指定本地端位址,資料格式為,sockaddr,namelen,:,name,之資料長度,(,單位,byte),回傳值:,-1,表錯誤,否則為,0,Sockaddr_in,格式,(IPv4,用,),struct,sockaddr_in, short,sin_family,;,u_short,sin_port,;,struct,in_addr,sin_addr,;,char sin_zero8;,;,sin_family,:,位址資料族系,同樣設定為,AF_INET,sin_port,:,主機開啟的通訊埠號 用,htons,(),寫入,sin_addr,:,主機,IP,位址,in_addr,資料格式,sin_zero8:,目前沒用處,保留以後使用,in_addr,格式,typedef,struct,in_addr,union ,struct,u_char,s_b1,s_b2,s_b3,s_b4;,S_un_b,;,struct,u_short,s_w1,s_w2;,S_un_w,;,u_long,S_addr,;,S_un,;,in_addr,;,使用了,union,的結構體,實際上的大小是一個,32bit,的長整數,所以只要注意,u_long,S_addr,這個變數 將,IP,對此變數寫入便可,函式庫引入的標頭檔應該會,有,定義,#define,s_addr,S_un.s_addr,此後只要對前一頁之變數,sin_addr.s_addr,存取便可,寫入時使用,inet_addr(“IP,位址字串”,),轉換成,unsigned long,範例,SOCKET Sock;,sockaddr_in,saServer,;,Sock = socket(,AF_INET,SOCK_STREAM,IPPROTO_TCP,);,/,設定本機通訊用的位址,saServer.sin_family,= AF_INET;,saServer.sin_port,= htons(5150);,/,啟用,5150 port,saServer.sin_addr.s_addr,= inet_addr(“140.115.65.30”);,/,設定本機,IP,/,呼叫,Bind,函式,bind(Sock,(SOCKADDR,*) &,saServer,sizeof(saServer,) );,Listen,函式,設定,socket,等待外部連線,listen(),是使,Socket,進入等待連線狀態,等待客戶端,(Client),連上線來,很顯然的呼叫此函式的主機,功能會是一台伺服器,(Server),。,如果有,Client,想要連過來,此時可以呼叫,connect(),來跟,Server,連線。而,Server,接受後會建立新的,socket,和,Client,通訊,,listen socket,則繼續存在等待其他,Client,,直到關閉為止。,listen(),函式,int,listen(,SOCKET,s,int,backlog,);,s,:設定好,bind(),並且尚未連線的,socket,Backlog,:等待,Server,接受連線前,同時最大連線數,回傳值:,-1,表錯誤,否則為,0,Accept,函式,接受外部連線,Blocking Non-blocking,Accept(),函式,SOCKET,accept(,SOCKET,s,struct,sockaddr,*,addr,int,*,addrlen,);,s,:一個設定為,listen,狀態的,socket,s,ddr,:,Client,端位址資訊,由函式自動產生填入,addrlen,:,s,ddr,長度,由函式自動產生,回傳值:,-1,表示錯誤,否則傳回另一個包含,Client,端資訊的新,socket descriptor,,作為傳送資料用,傳進,accept(),的,listen socket,本身並沒有辦法作資料的傳輸,所以必須透過,accept(),產生一個包含通訊協定、,Server,、,Client,資訊的新,socket,,利用他就可以進行資料的傳輸了,範例,ListenSocket,為一個,bind(),過且未連線的,socket,/,設定,socket,為接聽外部連線用,if (listen(,ListenSocket, 1 ) = SOCKET_ERROR),printf(Error,listening on socket.n);,/,宣告一個用來和,Client,連線用的,socket,SOCKET,AcceptSocket,;,/,接受外部連線,while(1) ,AcceptSocket,= SOCKET_ERROR;,/,尚未取得,socket descriptor,,,等待外部連線進入時重設,while(,AcceptSocket,= SOCKET_ERROR ) ,AcceptSocket,= accept(,ListenSocket, NULL, NULL );,printf(Client,connected.n);,break;,connect,函式 與等待接聽的,socket,連線,Client,端若要與,Server,溝通,必須透過,connect,建立連線,經過驗證確定連線成功後,才能進行資料傳輸。,三向交握,(three-way handshake),機制:,1.Client,向,Server,提出連線要求,(connect(),2.Server,若接到要求,則回應,Clinet,接到要求,3.Client,接到回應,向,Server,表示收到回覆,至此才算連線建立完成,雙方可以開始交換資料,若發生錯誤,則會由轉送中繼站回傳,ICMP,錯誤訊息,connect,函式讀到後,會回報錯誤給程式,connect(),函式,int,connect(,SOCKET,s,const,struct,sockaddr,*,name,int,namelen,);,設定方式請參照,bind(),函式,name,內資料為,回傳值:,-1,表錯誤,否則回傳,0,recv(),send,(),函式 處理資料收送,從先前設定好,Server,與,Client,的通訊方式後,我們利用進行資料交換的函式,recv(),send,(),來處理要溝通的資料,其實資料溝通的函式有許多種類,,read(),write(),readv(),writev(),recvmsg,(),sendmsg,(),等等,我們介紹,recv,(),和,send(),給大家入門,其他函式的使用可以查閱,MSDN,或,man,說明文件,recv,(),函式,int,recv,(,SOCKET,s,char*,buf,int,len,int,flags,);,s,:一個建立連線成功的,socket,buf,:呼叫,recv,,用來儲存收到資料的暫存器,len,:,buf,的長度,(byte),flags,:選擇工作模式,一般填入,0,回傳值:,-1,表錯誤,否則傳回接受到資料的長度,(byte),send(),函式,int,send(,SOCKET,s,const char*,buf,int,len,int,flags,);,s,:一個建立連線成功的,socket,buf,:用來儲存將送出資料的暫存器,len,:,buf,的長度,(byte),flags,:選擇工作模式,一般填入,0,回傳值:,-1,表錯誤,否則傳回送出資料的長度,(byte),範例,/Server,端,int,bytesSent,;,int,bytesRecv,= SOCKET_ERROR;,char sendbuf32 = Server: Sending Data.;,char recvbuf32 = ;,bytesRecv,=,recv,(,m_socket,recvbuf, 32, 0 );,printf,( Bytes,Recv,: %ldn,bytesRecv,);,bytesSent,= send(,m_socket,sendbuf,strlen(sendbuf,), 0 );,printf,( Bytes Sent: %ldn,bytesSent,);,/Client,端,int,bytesSent,;,int,bytesRecv,= SOCKET_ERROR;,char sendbuf32 = Client: Sending data.;,char recvbuf32 = ;,bytesSent,= send(,m_socket,sendbuf,strlen(sendbuf,), 0 );,printf,( Bytes Sent: %ldn,bytesSent,);,while(,bytesRecv,= SOCKET_ERROR ) ,bytesRecv,=,recv,(,m_socket,recvbuf, 32, 0 );,if (,bytesRecv,= 0 |,bytesRecv,= WSAECONNRESET ) ,printf,( Connection Closed.n);,break;,if (,bytesRecv,Items-Add(),新增資料或是,ListBox1-Items-Insert(),插入資料,Add(,字串,), Insert(,位置,字串,),由於本次,Server,端只用到這一個元件,直接拉到滿版,Server,端用到的元件,Timer ,計時器等待,定時輪詢,Server,端用到的語法,#define A B,定義,A,為,B,,如利用,#define,Add(Text,) ListBox1-Items-Insert(0,Text),這樣就可以用簡短的,Add(“,文字”,),指令取代一長串的,Insert,指令,註:,#define,只會增加編譯時間,(,要轉換,),,對於程式的實際效能毫無影響,Server,端的工作流程,程式啟動直接開始監聽工作,WSAStartup,socketbindlisten,程式結束時關閉連線,shutdown,closesocket,Server,端的工作流程,用,Timer,做定時監測若已經連線,recv,接收資料,否則,accept,接受連線,!,accept &,recv,在沒有資料進入,(,沒人連線或沒有資料,),時會阻塞住導致程式停止回應,Server,停止回應的處理方法,1.,用非阻塞式函數,WSAAcceptEx,WSARecv,WaitForSingleObject,2.,多執行緒,3.,中斷法,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!