目錄
1. 預備介紹
2.網絡字節序
3.udp網絡程序
4.地址轉換函數
5.udp網絡編程
1.預備介紹
1.1源IP地址和目標IP地址
舉個例子:
? ? ? 從北京出發到上海旅游, 那么源IP地址就是北京, 目標IP地址就是上海.
?1.2 端口號
?作用: 標識一個進程, 告訴OS這個數據交給那個進程來處理;
(1) 端口號是2字節16位數據;
(2) 端口號+IP地址就可以標識特定的某一臺主機和某一個進程來處理;
(3)?一個端口號只能標識一個進程;
小tips:
端口號和進程ID有什么聯系?
一個進程可以有多個端口號, 但是一個端口號只能標識一個進程.
源端口號和目標端口號
源端口號是指發送數據的應用程序在本地計算機上使用的端口號,而目的端口號是指接收數據的應用程序在遠程計算機上使用的端口號。
舉個栗子: 送快遞的這個快遞是誰發的,就是源端口號, 發送給誰就是目標端口號.
?1.3 TCP協議和udp協議特點
TCP特點: 傳輸層協議 有連接 可靠傳輸 面向字節流
UDP特點:?傳輸層協議 無連接 不可靠傳輸 面向數據報
?2.網路字節序
網絡數據流和內存地址一樣也是分大小端的, 網絡字節序就是用來定義網絡數據流的地址.
(1)發送端主機通常將緩沖區的數據由低到高的順序發出;
(2)接受端主機也將數據由低到高的順序進行保存到緩沖區;
(3)所以先發出的數據是低地址, 后發出的是高地址.
(4)無論主機是大端還是小端機,?都是按照TCP/IP協議是大端字節序(低位是高地址);
2.1 認識一些接口用于主機字節序和網絡字節序的交換:
(1)socket: 創建一個套接字.(文件描述符)
參數1.domain:地址族; 就是IP地址類型, 常用有AF_INET和AF_INET6.
2.type:套接字的類型, 有SOCK_STREAM(流式套接字) 和 SOCK_DGRAM(數據報套接字);
3.protocol: 傳輸協議;
(2) bind: 綁定端口號.
(3) listen: 監聽端口號;
(4)accept接受請求:
(5) connect建立連接:
sockaddr結構體:網絡編程接口
sockaddr:保存多種類型的IP的地址和端口號.
sockaddr_in: 用來專門保存IPv4的地址
3.udp網絡程序
這里專門后面寫一篇博客詳細講解! 大家可以蹲一波.謝謝!
4.地址轉換函數
sockaddr結構體里面的一個字段:
sin_addr: 是表示32位的IP地址, 我們通常的讀取地址字符串的點分十進制;
字符串轉in_addr的函數:
htonl和htons是用來主機序轉為網絡序;
ntohl和ntohs是用來網絡序轉為主機序;
in_addr轉字符串的函數:
inet_ntoa函數: 將返回結果放到了靜態區, 第二次調用會覆蓋之前的數據, 可能造成線程不安全的問題, 最好使用inet_ntop, 將數據存放在緩存區.
?5.TCP網絡編程
這個和udp編程放到一篇博客里面具體來講.
?6.sock API
(1)?sock:打開網絡通訊接口;成功就會返回一個文件描述符;
錯誤就會返回-1;
int sock(int domain, int type, int protocol)
(2) bind: 用來綁定特定的IP地址和端口號用來向服務器發起連接;
成功返回0, 失敗返回-1.
將sockfd和addr進行綁定, 用于網絡監聽文件描述符;
Add:
對于addr需要自己進行手動修改, bzero進行清零; 設置sin_family , sin_addr.s_addr ,
sin_port.
int bind(int sockfd, const struct sockaddr* addr, socklen_t addrlen)
(3)?listen: 網絡監聽
backlog是運行客戶端等待連接的個數;
listen()成功返回0,失敗返回-1;
int listen(int sockfd, int backlog)
(4) accept:
三次握手成功之后, 調用accept接受連接;
如果還沒有客戶端連接的請求就會阻塞等待直到客戶端連接;
addr參數是用來傳出客戶端的IP和端口號; 如果為NULL就是不關系客戶端的地址;
addrlen參數就是用來緩沖區的長度避免溢出, 傳出的是sockaddr的實際長度.
int accept(int sockfd, const struct sockaddr* addr, struct socklen_t* addrlen)
(5) connect:連接服務器;??
與bind的區別: connect連接的是別人的地址, bind的是自己的地址.
成功返回0, 失敗返回-1.
int connect(int sockfd, const struct sockaddr* addr, socklen_t addrlen)