線索
|
1.記錄:
- 網絡原理
- 計算機網路是一種容許計算機進行即時通信的工具
- 計算機物理鏈接多是電纜也多是無線介質
- 生成、轉發以及銷燬數據的網絡設備稱之爲網絡節點
- OSI模型
- 國際標準協議OSI模型是一種字面模型,並且跟IP協議不要緊
- 第一層:物理層:bit流傳輸,主要是物理介質
- 第二層:數據鏈路層:提供介質訪問,鏈路管理,各類鏈路轉換
- 第三層:網絡層:尋址和路由的選擇,路由器,轉換尋址,路由器
- 第四層:傳輸層:創建主機端到端的鏈接,4層,0保障最少,3最多
- 第五層:會話層:創建、維護和管理會話,創建的檢查點等機制
- 第六層:表示層:處理數據格式、數據加密,提供與應用分離的格式
- 第七層:應用層:提供應用程序間通訊,識別資源模式
- IP協議
- 爲計算機網絡相互鏈接進行通信而設計的協議
- 是一套由軟件、程序所組成的協議,把各類系統不一樣的信息轉換成統一的格式,使全部的網絡節點能實現互通。
- 第一層:鏈路層
- 第二層:鏈接層,IPV四、IPV6
- 第三層:傳輸層
- 第四層:應用層
- TCP協議
- TCP協議是IP協議組件中最重要的組成部分
- TCP基於IP協議,提供了可靠,有序,錯誤校驗的數據流,用於局域網和廣域網中程序之間的信息交換。
- 坐落於IP協議的傳輸層
- Socket套接字
- 程序間通信流的終端,客戶端使用套接字進行通信。
- 套接字API是一種應用程序開發接口,通常由操做系統提供。(通常指廣域網套接字)
- 通常爲IP地址與端口的結合
- 組成:本地IP、遠程IP、協議
- 程序流程
- 客戶端流程:創建套接字-鏈接服務器-進行通信-關閉套接字
- 服務端流程:創建套接字-監聽-接收鏈接請求-進行通信-接收客戶端關閉套接字信息-關閉套接字
- 函數接口
- socket()建立一個新的套接字並分配系統資源
- bind()通常用於服務端,將套接字與套接字地址(例如本地端口以及IP地址)綁定
- listen() 通常用於服務端,將綁定的TCP置於監聽狀態
- connect() 通常用於客戶端,分配一個本地的空閒端口,而且與遠程地址創建鏈接
- accept() 通常用於服務端,接受一個新的鏈接請求,並建立一個與該連接綁定的套接字
- send() 與 recv(), 或 write() 與read(), 或sendto() 與recvfrom()用於發送和接收數據
- close() 關閉一個打開的套接字並釋放資源
- gethostbyname() 與gethostbyaddr() 在IPv4協議中解析域名和地址
- select() 用於等待一個或多個指定套接字的下一個讀寫事件
- poll()用於測試一個或多個套接字的讀寫狀態
- getsockopt() 獲得指定套接字的參數
- setsockopt() 配置指定套接字的參數
- 典型服務端
-
int main(void)
{
//套接字地址
struct sockaddr_instSockAddr;
//創建套接字
intSocketFD= socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
//判斷套接字是否成功
if(-1==SocketFD)
{
perror("can not create socket");
exit(EXIT_FAILURE);
}
//重置套接字地址信息
memset(&stSockAddr,0,sizeof(stSockAddr));
stSockAddr.sin_family= AF_INET;
stSockAddr.sin_port= htons(1100);
stSockAddr.sin_addr.s_addr= htonl(INADDR_ANY);
//綁定端口
if(-1== bind(SocketFD,(structsockaddr*)&stSockAddr,
sizeof(stSockAddr)))
{
perror("error bind failed");
close(SocketFD);
exit(EXIT_FAILURE);
}
//監聽端口
if(-1== listen(SocketFD,10))
{
perror("error listen failed");
close(SocketFD);
exit(EXIT_FAILURE);
}
//循環
for(;;)
{
//監聽鏈接
intConnectFD= accept(SocketFD, NULL, NULL);
if(0>ConnectFD)
{
perror("error accept failed");
close(SocketFD);
exit(EXIT_FAILURE);
}
/* perform read write operations ...
read(ConnectFD,buff,size)*/
if(-1== shutdown(ConnectFD, SHUT_RDWR))
{
perror("can not shutdown socket");
close(ConnectFD);
close(SocketFD);
exit(EXIT_FAILURE);
}
close(ConnectFD);
}
close(SocketFD);
return EXIT_SUCCESS;
}
- 典型客戶端
-
int main(void)
{
struct sockaddr_instSockAddr;
intRes;
intSocketFD= socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if(-1==SocketFD)
{
perror("cannot create socket");
exit(EXIT_FAILURE);
}
memset(&stSockAddr,0,sizeof(stSockAddr));
stSockAddr.sin_family= AF_INET;
stSockAddr.sin_port= htons(1100);
Res= inet_pton(AF_INET,"192.168.1.3",&stSockAddr.sin_addr);
}
if(0>Res)
{
perror("error: first parameter is not a valid address family");
close(SocketFD);
exit(EXIT_FAILURE);
}
elseif(0==Res)
{
perror("char string (second parameter does not contain valid
ipaddress)");
close(SocketFD);
exit(EXIT_FAILURE);
}
if(-1== connect(SocketFD,(struct sockaddr*)&stSockAddr,
sizeof(stSockAddr)))
{
perror("connect failed");
close(SocketFD);
exit(EXIT_FAILURE);
}
/* perform read write operations ... */
(void) shutdown(SocketFD, SHUT_RDWR);
close(SocketFD);
return EXIT_SUCCESS;
}
2.簡化:
- 計算機網絡是一種容許計算機通信的工具。
- OSI模型是一種標準化的字面模型,沒有真正的普遍運用,其包括:物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層、應用層。
- IP網絡互聯協議是一種被普遍運用的互聯網協議,主要包括:鏈路層、鏈接層、傳輸層、應用層。
- TCP基於IP協議,提供了可靠,有序,錯誤校驗的數據流,是普遍運用與程序中間的。
- 套接字是一種通常由系統提供的應用程序開發接口。
3.背誦: 4.思考:
- 網絡編程的難度到底在哪裏,這裏一直是我薄弱網絡編程水平所沒法真正理解的地方。做爲一個java程序員,瞭解過c,api不難用,netty也關注過,彷佛打造一個穩定的網絡服務是一件很是麻煩的事情,做爲程序員,其實在本質上很難理解對錯以外的事情。這個彷佛能夠說得上是缺陷。能力上的缺陷。
5.複習: |