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

下载本文档

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

文档简介

1、.Socket使用Win32 API.一個網路通訊程式.什麼是Socket凡是網路兩端互相連線傳送資料時的溝通介面就是socket,是一個網路系統的通訊函式庫,在任何作業系統中可以通用主要的5大函式:socket() 電話bind() 線路(第幾分機?)listen() 準備好接聽(啟用鈴聲)connect() 撥電話出去accept() 對方接聽.Socket函式,指定通訊協定.socket ( )函式int SOCKETint SOCKET socket(socket( intint af, ,intint type, , intint protocol );); af :位址資料族系(f

2、amily),用不同方式表示網路位址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;/宣告soc

3、k = socket(/設定AF_INET, SOCK_STREAM, IPPROTO_TCP); .Bind函式,指定本地端位置.Bind()Bind()函式函式intint bind(bind(SOCKETSOCKET s, , const struct sockaddrconst struct sockaddr* * name, , intint namelen ););s : : 指定好通訊協定的socket name : 指定本地端位址,資料格式為sockaddrsockaddrnamelen : : name之資料長度(單位byte)回傳值:-1表錯誤,否則為0.Sockaddr_

4、in Sockaddr_in 格式格式(IPv4(IPv4用用) )struct sockaddr_in short sin_family;u_short sin_port; struct in_addr sin_addr; char sin_zero8; ;sin_family:位址資料族系,同樣設定為AF_INETsin_port:主機開啟的通訊埠號 用htons() 寫入sin_addr:主機IP位址 in_addr資料格式sin_zero8:目前沒用處,保留以後使用.in_addrin_addr格式格式typedef struct in_addr union struct u_char

5、 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 saSe

6、rver; Sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);/ 設定本機通訊用的位址saServer.sin_family = AF_INET; saServer.sin_port = htons(5150);/啟用5150 portsaServer.sin_addr.s_addr = inet_addr(“140.115.65.30”); /設定本機IP/ 呼叫Bind函式 bind(Sock,(SOCKADDR*) &saServer, sizeof(saServer) ); .ListenListen函式函式 設定設定socketsock

7、et等待外部連線等待外部連線listen()是使Socket進入等待連線狀態,等待客戶端(Client) 連上線來,很顯然的呼叫此函式的主機,功能會是一台伺服器(Server)。如果有Client想要連過來,此時可以呼叫connect()來跟Server 連線。而Server接受後會建立新的socket和Client通訊,listen socket則繼續存在等待其他Client,直到關閉為止。. listen()listen()函式函式int listen( SOCKET s, int backlog ); s:設定好bind(),並且尚未連線的socketBacklog:等待Server接受

8、連線前,同時最大連線數回傳值:-1表錯誤,否則為0.AcceptAccept函式函式 接受外部連線Blocking Non-blocking.Accept() Accept() 函式函式SOCKET accept( SOCKET s, struct sockaddr* addr, int* addrlen ); s:一個設定為listen狀態的socketsddr:Client端位址資訊,由函式自動產生填入addrlen:sddr長度,由函式自動產生回傳值:-1表示錯誤,否則傳回另一個包含Client端資訊的新socket descriptor,作為傳送資料用傳進accept()的listen

9、 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 =

10、 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提出連線

11、要求(connect()2.Server若接到要求,則回應Clinet接到要求3.Client接到回應,向Server表示收到回覆至此才算連線建立完成,雙方可以開始交換資料若發生錯誤,則會由轉送中繼站回傳ICMP錯誤訊息connect函式讀到後,會回報錯誤給程式.connect()connect()函式函式int connect( SOCKET s, const struct sockaddr* name, int namelen ); 設定方式請參照bind()函式name內資料為回傳值:-1表錯誤,否則回傳0.recv(),send()recv(),send()函式函式 處理資料收送處理資

12、料收送從先前設定好Server與Client的通訊方式後,我們利用進行資料交換的函式recv(),send()來處理要溝通的資料,其實資料溝通的函式有許多種類,read(),write(),readv(),writev(),recvmsg(),sendmsg()等等,我們介紹recv()和send()給大家入門,其他函式的使用可以查閱MSDN或 man 說明文件.recv() recv() 函式函式int recv( SOCKET s, char* buf, int len, int flags ); s:一個建立連線成功的socketbuf:呼叫recv,用來儲存收到資料的暫存器len:bu

13、f的長度(byte)flags:選擇工作模式,一般填入0回傳值:-1表錯誤,否則傳回接受到資料的長度(byte).send()send()函式函式int send( SOCKET s, const char* buf, int len, int flags); s:一個建立連線成功的socketbuf:用來儲存將送出資料的暫存器len:buf的長度(byte)flags:選擇工作模式,一般填入0回傳值:-1表錯誤,否則傳回送出資料的長度(byte).範例範例/Server端int bytesSent; int bytesRecv = SOCKET_ERROR; char sendbuf32 =

14、 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 = Clie

15、nt: 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

16、; if (bytesRecv 0) return; printf( Bytes Recv: %ldn, bytesRecv ); .closesocket(),shutdown()closesocket(),shutdown()函式函式 中斷連線中斷連線在accept()或connect()成功後建立的通訊用socket,必須由Client或Server下達closesocket()或shutdown()來結束連線。closesocket()可以用來終止TCP連線,但不會馬上關閉,必須等到該socket不在動作後才切斷連線,這和TCP協定中使用到的sliding window有關,這是用完再

17、關的函式,而shutdown()是有強制性質的中斷連線函式,用來控制socket的IO。一個好的中斷連線作法應有四步:1.結束傳送資料2.使用shutdown(),設定為禁止送出資料3.呼叫recv(),確定收到的資料長度為0,避免遺漏資訊4.closesocket() 來關閉socket註:在Winsock中使用的closesocket()和BSD socket中的close()是相同的.closesocket() closesocket() 與與 shutdown()shutdown()函式函式int closesocket( SOCKET s ); int shutdown( SOCKE

18、T s, int how );s:使用中的socket how:控制socket工作的方式SD_RECEIVE 禁止輸入(disable recv()函式)SD_SEND 禁止輸出(disable send()函式)SD_BOTH 雙向禁止回傳值:-1表錯誤,否則傳回0.Server-Client Modelrecv() send().WINSOCKETSp#include .WINSOCKETSpWSADATA wsadata;pif (WSAStartup(0 x101,(LPWSADATA) &wsadata) != 0) fprintf(stderr,echo_srv: cant use WinSock DLLn);exit(1); .WINSOCKETSpWSACleanup();.Serve

温馨提示

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

评论

0/150

提交评论