网络编程基础函数
協議:
一組規則。
分層模型結構:
OSI七層模型:物,數,網,傳,會,表,應
TCP/IP 4層模型:網(鏈路層/網絡接口層),網(網絡層),傳,應
應用層:http,ftp,nfs,ssh,telnet
傳輸層:TCP
網絡層:IP,ICMP,IGMP
鏈路層:以太網幀協議,ARP
網絡傳輸流程:
數據沒有封裝之前,是不能在網絡中傳遞的
以太網幀協議:
ARP協議:根據IP地址獲取mac地址
以太網幀協議:根據mac地址,完成數據包傳輸
IP協議:
版本:IPV4 IPV6 —4位
TTL:time to live 。。 設置數據包在路由節點的跳轉上限
該值減1,減為0的路由,有義務將該數據包丟棄
源IP:32位 192.168.1.108 —點分十進制 IP地址(String) —(二進制)
目的IP:32位
c/s模型:
client-server (客戶端-服務器模型)
優點:緩存大量數據,協議選擇靈活(可以自定義協議)
缺點:安全性,開發工作量大
b/s模型:
browser-server(瀏覽器-服務器模型)
缺點:不能緩存大量數據,嚴格遵守http協議
優點:安全,跨平臺,開發工作量小(不用開發瀏覽器,只用搞服務器)
IP地址:可以在網絡環境中,唯一標識一臺主機
端口號(也就是PID進程ID):可以在網絡的一臺主機上,唯一標識一個進程
IP地址+ 端口號:可以在網絡環境中,唯一標識一個進程
UDP:
16位:源端口號
16位:目的端口號
IP協議:
16位:源端口號
16位:目的端口號
32位序號
32位確認序號
6個標志位
16位窗口大小
網絡套接字:socket(插板)
一個描述符指向一個套接字(該套接字內部由內核借助兩個緩沖區實現)
在通信過程中,套接字肯定是成對出現的
intel一般都是小端法(pc存儲)
TCP/IP協議,網絡數據流應采用大端字節序(網絡存儲)
htonl函數 (提示:l代表long 四字節) host—>ntework 32位 (IP)
htons函數 本地—>網絡 (提示 s代表short,2字節) (port)
ntohl 函數 網絡—>本地(IP)
ntohl 函數 網絡—>本地(port)
192.168.1.11---->string---->atoi—>int—>htonl---->網絡字節序
IP地址轉換函數
int inet_pton(int af,const char * src,void *dst) 本地字節序(String)---->網絡字節序
(IP協議)af:AF_INET(IPV4) AF_INET6(IPV6)
src:傳入:IP地址(點分十進制)
dst:傳出:轉換后的網絡字節序的IP地址
返回值:
成功:1
異常:0,說明src指向的不是一個有效的IP地址
失敗:-1
const char* inet_ntop(int af,const char * src,char *dst,socklen_t size);
(IP協議)af:AF_INET(IPV4) AF_INET6(IPV6)
src:網絡字節序IP地址
dst:本地字節序(String IP)
size:dst 的大小
返回值:
成功 :dst
失敗: NULL
sockaddr地址結構:
struct sockaddr_in addr:
addr.sin_family=AF_INET/AF_INET6 (如何查看addr成員 man 7 ip)
addr.sin_port=htons(9527);
addr.sin_addr.s_addr=inet_pton(AF_INET,“192.157.22.6”,dst)
分兩步:
int dst;
inet_pton(AF_INET,“192.157.22.6”,(void *)&dst)
addr.sin_addr.s_addr=dst;
(*)addr.sin_addr.s_addr=htonl(INADDR_ANY) (取出系統中有效的任意的IP地址,二進制類型)
記得添加頭文件#include<arpa/inet.h>
bind(fd,(struct sockaddr *)&addr,size);
socket函數
#include<sys/socket.h>
int socket (int domain,int type,int protocol);
domain:AF_INET AF_INET6 AF_UNIX
type:SOCK_STREAM SOCK_DGREM
protocol:0
返回值:成功:新套接字對應文件描述符
失敗:-1 error
int bind(int sockfd,const struct sockaddr * addr,socklen_t addrlen)
給socket綁定一個地址結構(IP +port)
sockfd:socket 函數返回值
struct sockaddr_in addr:
add.sin_family=AF_INET;(這個參數應該和socket 中的domain保持一致)
addr.sin_port=htons(8888)
addr.sin_addr.s_addr=htonl(INADDR_ANY);
addr:(struct sockaddr *)&addr
addlen:sizeof(addr)地址結構大小
返回值:
成功:0
失敗:-1 error
int listen(int socket, int backlog);
設置同時與服務器建立連接的上限數(同時進行3次握手的客戶端數量)
sockfd:socket 函數返回值
backlog:上線數量,最大值128
返回值:
成功:0
失敗:-1 error
int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);
阻塞等待客戶端建立連接,成功的話,返回一個與客戶端成功連接的socket文件描述符。
sockfd:socket 函數返回值
addr:傳出參數。成功與服務器建立連接的那個客戶端的地址結構(IP+port)
(與bind第二個參數相差一個const,所以就大不相同)
socklen_t clit_addr_len=sizeof(addr)
addrlen:傳入傳出。&clit_addr_len
入:addr大小。出:客戶端addr實際大小
返回值:
成功:能與服務器進行數據通信的socket對應的文件描述符
失敗:-1 error
int connect(int sockfd,const struct sockaddr *addr,socklen_t addrlen);
使用現有的socket與服務器建立連接
sockfd:socket返回值
struct sockaddr_in srv_addr; //服務器地址結構
srv_addr.sin_port=9527 跟服務器bind時設定的port完全一致
inet_pton(AF_INET,“服務器IP地址”,&srv_addr.sin_addr.s_addr);
addr:傳入參數。服務器的地址結構
addlen:服務器地址結構的大小(長度)
返回值:
成功:0
失敗:-1 error
如果不適用bind綁定客戶端地址結構,采用“隱式綁定”,
總結
- 上一篇: 重游java(猜拳项目)
- 下一篇: 存储管理算法java代码