Windows Sockets & C++

  • 3396
  • 0
  • 2012-12-17

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: );