TCP:併發服務器 效率最高 多線程
UDP:循環服務器 不需要listen accept connect
Select(多路複用): 循環服務器
網絡編程注意點:
TCP/IP 四層模型 { 應用層,傳輸層,網絡層,網絡接口層 }
背三次握手四次揮手
DHCP協議是什麼?
套接字 有三種:
- TCP 流套接字 sock_stream
- UDP 數據報套接字 sock_dgram
- 原始套接字
服務器有什麼?
- IP 用以在局域網中 找到你的電腦(你就理解成定位系統)
- 端口號 找到對應的軟件(比如是發消息給你的電腦 哪個程序來接受消息?
QQ/微信/SKAPE)
Bind / accept 等的第二個參數 需要加強制轉換類型
第二個參數 的結構原型:
Struct sockaddr
{
U_short sa_family; //地址族協議
Char sa_data[14]; //存放ip 與 端口號
};
有關端口號: 1-65535 (x shell 中 connecting to 192.168.128.91 : 22這裏的22就是端口號)
1-1023 一般不用 被各種協議 佔用了
(1)知名端口(Well-Known Ports)
知名端口即衆所周知的端口號,範圍從0到1023,這些端口號一般固定分配給一些服務。比如21端口分配給FTP服務,25端口分配給SMTP(簡單郵件傳輸協議)服務,80端口分配給HTTP服務,135端口分配給RPC(遠程過程調用)服務等等。
(2)動態端口(Dynamic Ports)
動態端口的範圍從1024到65535,這些端口號一般不固定分配給某個服務,也就是說許多服務都可以使用這些端口。只要運行的程序向系統提出訪問網絡的申請,那麼系統就可以從這些端口號中分配一個供該程序使用。比如1024端口就是分配給第一個向系統發出申請的程序。在關閉程序進程後,就會釋放所佔用的端口號。
然後 這個結構慢慢演變了
Struct sockadddr_in
{
Short int sin_family; //internet 地址族
Unsigned short sin_port; //端口號 (自己要指定)
Struct in_addr sin_addr; //IP地址
Unsigned char sin_zero[8]; //填0
};
這裏就又涉及到一個知識點:大小端的轉換
內存中分爲 高地址 和 低地址
而數據又有 高字節 和 低字節
大端:高字節存放在低地址中
小端:低字節存放在低地址中
一般
小端:主機的字節序
大端:網絡的字節序
(遇到相關問題和題目 注意平臺與電腦鍵的轉換)
有關大小端的轉換:
Int a = 1;
A & 0x000000ff << 24 |
A & 0x0000ff00 << 8 |
A & 0x00ff0000 >> 8 |
A & 0xff000000 >>24
將A的左右移位完成大小端的轉化
Htonl:(在#include <arpa/inet.h> 頭文件中)
H:host 主機
To:
N:網絡
L:兩個字節 32位
S:一個字節 16位