第十一章、
網路程式設計基本原理
1、tcp/ip協議
一組在網路中提供可靠資料傳輸(傳輸控制協議tcp)和無連線資料服務(網際協議ip)的協議
提供主要服務:電子郵件、檔案傳輸、遠端登入、網路檔案系統、電視會議系統以及全球資訊網
體系結構:
1)應用層
包括網路應用程式和網路程序。為使用者提供各種服務,包括遠端登入、檔案傳輸和電子郵件
2)傳輸層
為應用程式提供端對端通訊。tcp協議、udp協議、icmp協議
3)網路層
處理機器之間的通訊問題,接受傳輸層請求,傳輸某個具有目的位址資訊的分組。該層把分組封裝到ip資料報中,填入資料報的頭部,使用路由演算法選擇是直接把資料報傳送到目標主機還是傳送給路由器,然後把資料報交給網路介面層對應的網路介面模組
4)網路介面層
負責接收ip資料報和把資料報通過選定網路傳送出去
2、客戶機/伺服器模式
伺服器:能在網路上提供服務的任何程式。包括主程式和從程式。主程式負責接受客戶請求,從程式負責處理客戶請求
客戶機:使用者為了得到某種服務所需要執行的應用程式
伺服器程式同時接收若干客戶請求,當客戶傳送請求時,伺服器是其在提供該服務的埠排隊,然後從佇列提供請求,為每個請求建立乙個子程序,由子程序處理具體服務細節
伺服器死鎖:因為乙個客戶而是伺服器不能處理其他客戶的請求
3、套介面程式設計基礎
套介面:網路程序的id
網路通訊:實質是程序間的通訊
唯一確定網路程序:ip位址(確定程序所在的計算機)和埠號port(與程序一一對應)
1)通用套介面位址資料結構
#include
struct sockaddr ;
總是通過指標向乙個套介面函式傳遞資訊
2)ipv4套介面位址資料結構
#include
struct in_addr ;
struct sockaddr_in ;
4、基本函式
1)位元組排序函式
小端位元組序(低低高高)和大端位元組序(低高高低)
網路位元組序使用的是大端位元組序,主機位元組序不確定。統一為網路位元組序
uint16_t htons(uint16_t hostvalue);
uint32_t htonl(uint32_t hostvalue);
返回的是網路位元組序
uint16_t ntohs(uint16_t netvalue);
uint32_t ntohl(uint32_t netvalue);
返回的是主機位元組序
h代表host,n代表network,s代表short(轉換埠號),l代表long(轉換ip位址)
2)位元組操作函式
int bcmp(const void *ptr1, const void *ptr2, size_t nbytes); //比較大小
void *memset(void *dest, int c, size_t len); //將目標指定數目的位元組設定位值
void *memcpy(void *dest, const void *src, size_t nbytes); //複製
int memcmp(const void *ptr1, const void *ptr2, size_t nbytes); //比較大小
3)位址轉換函式
套介面位址使用32位網路位元組序二進位制數值
in_addr_t inet_addr(const char *straddr); //返回32位二進位制的網路位元組序位址
int inet_aton(const char *straddr, struct in_addr *addrp);
char* inet_ntoa(struct in_addr *inaddr); //將32位二進位制值位址轉換為ascii位址
4)位元組流讀寫函式
read、write
5)連線函式
①建立套介面函式socket
#include
int socket(int family, int type, int protocol);
family表示協議族。af_inet表示ipv4協議,af_inet6表示ipv6協議
type表示位元組流型別。sock_stream表示tcp套介面,sock_dgram表示udp套介面
protocol一般為0
返回乙個非負套介面描述字
②繫結套介面函式bind
int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen);
sockfd為套接字,myaddr是指向特定協議位址結構的指標,addrlen是位址結構的長度
③connect函式
int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);
④listen函式
監聽是否有客戶程序要與它連線,然後響應這個連線請求
int listen(int sockfd, int backlog);
⑤accept函式
從已完成連線佇列的隊頭返回下乙個已完成連線,如果為空,則程序睡眠
int accept(int sockfd, struct sockaddr *addr, socklen_t addrlen);
三段握手
a)客戶端先用connect()向伺服器傳送乙個要求連線的訊號syn1(未完成連線的佇列)
b)伺服器接受後,發回應答訊號ack1,同時也是乙個要求回答的訊號syn2
c)客戶端收到訊號ack1和syn2後,再次應答ack2(完成連線的佇列)
d)伺服器收到應答訊號ack2,一次連線建立完成
⑥close函式
int close(int sockfd);
關閉時已經排隊準備傳送的資料仍會被發出
⑦shutdown函式
int shutdown(int sockfd, int how); //雙向還是單向
關閉套介面的通訊功能
⑧新程序
fork函式
exec函式
⑨協議位址
int getsockname(int sockfd, struct sockaddr *localaddr, socklen_t addrlen); //返回本地協議位址
int getpeername(int sockfd, struct sockaddr *peeraddr, socklen_t addrlen); //返回遠端協議位址
5、ip位址轉換
1)網域名稱服務系統(dns)
主機名與ip位址之間的轉換服務
2)名字位址轉換為數字位址
#include
struct hostent *gethostbyname(const char *hostname);
3)數字位址轉換為名字位址
struct hostent *gethostbyaddr(const void *addr, socklen_t len, int type);
4)得到當前主機的名字的函式
#include
int uname(struct utsname *name);
返回當前主機的名字
5)伺服器名轉換為埠號的函式
struct servent *getservbyname(const char *name, const char* proto);
struct servent *getservbyport(int port, const char* proto);
第十一章 網路程式設計
每個網路應用都是基於客戶端 服務端模型的。根據這個模型,乙個用用是由乙個伺服器和乙個或多個客戶端組成的。伺服器管理資源,以某種方式操作資源,為客戶端服務。例如,乙個web伺服器管理著一組磁碟檔案,它會代表客戶端進行檢索和執行。客戶端 服務端模型中的基本操作是事務。乙個客戶端 伺服器事務由以下四步組成...
第十一章程式設計題
2.在這個題目中,我的設計的不人性化在於,我必須要求使用者給輸入自己要輸入整數的大小,然後我再給他分配記憶體,這分明是通過折磨使用者來使自己的程式變得簡單,而guide s answer則是只需要使用者輸入你該輸入的數即可。程式設計的思路如下 1.先預設一定大小 巨集定義 的記憶體分配 2.然後在讀...
網路流 基本原理
1 網路 g是乙個簡單有向圖,g v,e v 在v中指定乙個頂點s,稱為源和另乙個頂點t,稱為匯。有向圖g的每一條邊 v,w e,對應有乙個值cap v,w 0,稱為邊的容量。這樣的有向圖g稱作乙個網路。2 網路流 網路上的流是定義在網路的邊集合e上的乙個非負函式flow 並稱flow v,w 為邊...