Sunday, December 9, 2012

Windows Sockets & C++

網路程式-C/S、B/S

Client/Server:C/S

1.Client將需求傳遞給Server,再將Server回傳的結果已一定形式提供給使用者。
2.Server通常處於休眠狀態,直到客戶端對該伺服器發出連線請求,將其喚醒。

Browser/Server:B/S

1.客戶端執行瀏覽器,瀏覽器以超文字形式向Web伺服器提出存取資料庫請求。
2.Web瀏覽器是客戶端主要的軟體,系統功能實作的核心部分集中到伺服器上。
Client – Server 將任務合理分配至客戶端和伺服器端,降機系統的通訊開銷。 需要安裝
Browser – Server 系統況展容易,維護和升級方便。 對伺服器端附載較重
Windows Sockets軟體方展基於C/S。

Sockets是一個簡單的網路應用程式介面。

協定特徵:

1.連線導向與無連線導向


  連線導向:傳送資料的來源主機必須首先與目的主機連線,透過三向交握。

  無連線導向:傳送資料的來源主機與目的主機之間沒有建立連線過程。(不保證正確)

2.訊息導向:

  對離散命令來說,如果傳輸協定把每條命令作為獨立的訊息進行傳輸,稱為協定的訊息導向。
  對接收端來說,每接收的資料正式對應傳送端傳送的離散訊息。

3.緩衝關閉:

   不支援緩衝關閉:只要一方關閉通訊,會導致連線立即中斷和資料丟失,接收端不能讀取這些資料。
                              對TCP協定來說,只有連線雙方都執行一次關閉,才能中斷連線。
在 Windows Sockets中,關閉Socket的連線和關閉Socket是不同的。關閉Socket的連線時,雙方要交換協定訊息,
按照一定順序關閉連線。而關閉Socket是指關閉Socket控制碼,釋放占用資源。
客戶端執行緩衝關閉流程: 繪圖1
IP定址:
Windows Sockets透過AF_INET位址家族為IP通訊協定,A代表address,F代表family。
   1: #define AF_INET    2

SOCKADDR_IN結構用來指定IP與Port:


   1: struct sockaddr_in{

   2:     short     sin_family;        //位址家族

   3:     u_short   sin_port;          //port

   4:     struct    sin_addr sin_addr;//in_add類型的IP位址

   5:     char      sin_zero[8];      //填充結構大小,使之與SOCKADDR大小相同

   6: };

位元組排序:
從最有意義的位元組到最無意義的位元組來表示資料,稱為 network-byte-order。

h代表主機,n代表net,l代表long,s代表short,to代表轉換:


   1: u_long htonl(

   2:     u_long    hostlong

   3: );

   4:  

   5: u_short htons(

   6:     u_short hostshort

   7: );

   8:  

   9: u_long ntohl(

  10:     u_long netlong

  11: );

  12: u_short ntohs(

  13:     u_short netshort

  14: );

開發TCP應用程式時,客戶端與伺服器執行步驟:

繪圖2

1.WSAStartup():
再載入Windows Sockets DLL後,複寫



   1: int WSAStartup

   2: {

   3:     WORD wVersionRequested,    //載入Windows Socket DLL版本

   4:     LPWSADATA lpWSAData        //指向LPWSADATA結構的指標

   5: };

其WSADATA結構:


   1: #define WSADESCRIPTION_LEN 256

   2: #define WSASYS_STATUS_LEN 128

   3:  

   4: typedef struct WSAData{

   5:     WORD           wVersion;//期望使用得版本

   6:     WORD           wHighVersion;//DLL支援得最高版本

   7:     char           szDescription[WSADESCRIPTION_LEN];//DLL的描述資訊

   8:     char           szSystemStatus[WSASYS_STATUS_LEN+1];//DLL的狀態資訊

   9:     unsigned short iMaxSockets;//一個行程可打開Socket最大數量

  10:     unsigned short iMaxUdpDg;//一個行程傳送或接收的最大資料封包長度

  11:     char FAR *     lpVendorInfo;

  12: }WSADATA,FAR * LPWSADATA;

2.socket():

初始化 Windows Sockets DLL後:


   1: SOCKET socket(

   2:     int af,        //建立TCP/UDP Socket時,該參數為AF_INET

   3:     int type,      //Socket類型,SOCK_STREAM.SOCK_DGRAM.SOCK_RAW 3

   4:     int protocol   //指定位址家族和Socket類型較多數目時,使用該欄位來限定一個特殊傳輸。

   5: );

3.bind():

將socket綁定到一個已知的位址,成功則回傳 0:


   1: int bind(

   2:     SOCKET s,

   3:     const struct sockaddr FAR*    name,

   4:     int    namelen

   5: );

4.listen():

將Socket設置為監聽模式,成功時回傳 0:


   1: int listen(

   2:     SOCKET s,

   3:     int backlog

   4: );

5.accept():

實作接受一個連線請求的功能:


   1: SOCKET accept(

   2:     SOCKET                  s,      //監聽Socket

   3:     struct sockaddr FAR*    addr,   //回傳請求連線主機的位址

   4:     int FAR*                addrlen //傳回SOCKADDR_IN結構長度

   5: );

6.recv():

recv().WSARecv()用於接收資料:


   1: int recv(

   2:     SOCKET       s,

   3:     char FAR*    buf, //接收資料緩衝區

   4:     int          len, //緩衝區長度

   5:     int          flags 

   6: );

7.send()

send().WSASend()用於傳送收資料:


   1: int send(

   2:     SOCKET           s,

   3:     const char FAR * buf,

   4:     int              len,

   5:     int              flags

   6: );

8.closesocket():

關閉Socket,釋放占用資源:


   1: int closesocket(

   2:     SOCKET s

   3: );

9shutdown():

通知對方不接收不傳送資料:


   1: int shutdown(

   2:     SOCKET s,

   3:     int    how

   4: );

10.connect():


   1: int connect(

   2:     SOCKET    s,

   3:     const struct sockaddr FAR* name, //伺服器位址

   4:     int    namelen

   5: );

No comments:

Post a Comment