網路程式-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 | 系統況展容易,維護和升級方便。 | 對伺服器端附載較重 |
Sockets是一個簡單的網路應用程式介面。
協定特徵:
1.連線導向與無連線導向
連線導向:傳送資料的來源主機必須首先與目的主機連線,透過三向交握。
無連線導向:傳送資料的來源主機與目的主機之間沒有建立連線過程。(不保證正確)
2.訊息導向:
對離散命令來說,如果傳輸協定把每條命令作為獨立的訊息進行傳輸,稱為協定的訊息導向。對接收端來說,每接收的資料正式對應傳送端傳送的離散訊息。
3.緩衝關閉:
不支援緩衝關閉:只要一方關閉通訊,會導致連線立即中斷和資料丟失,接收端不能讀取這些資料。對TCP協定來說,只有連線雙方都執行一次關閉,才能中斷連線。
在 Windows Sockets中,關閉Socket的連線和關閉Socket是不同的。關閉Socket的連線時,雙方要交換協定訊息,
按照一定順序關閉連線。而關閉Socket是指關閉Socket控制碼,釋放占用資源。
客戶端執行緩衝關閉流程:
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應用程式時,客戶端與伺服器執行步驟:
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