關於一些網絡編程的常識整理。linux
1.網絡數據傳輸到咱們的計算機,是如何知道傳輸給那個應用?
經過端口,因此端口也是不能重複佔用的。編程
typedef struct sockaddr_in { #if(_WIN32_WINNT < 0x0600) short sin_family; #else //(_WIN32_WINNT < 0x0600) ADDRESS_FAMILY sin_family; #endif //(_WIN32_WINNT < 0x0600) USHORT sin_port; IN_ADDR sin_addr; CHAR sin_zero[8]; } SOCKADDR_IN, *PSOCKADDR_IN;
1.sin_family 設置的爲地址族
2.sin_port 爲端口號,16位也就是兩個字節,因此端口範圍是1-65535,其中1-1000是系統保留的端口號,可是並非咱們不能用,只是最後不用。
1024-5000: BSD臨時端口,通常的應用程序使用1024到4999來進行通信;
5001-65535: BSD服務器(非特權)端口,用來給用戶自定義端口.服務器
ip 地址的定義
typedef struct in_addr {
union {
struct { UCHAR s_b1,s_b2,s_b3,s_b4; } S_un_b;
struct { USHORT s_w1,s_w2; } S_un_w;
ULONG S_addr;
} S_un;網絡
typedef struct sockaddr { #if (_WIN32_WINNT < 0x0600) u_short sa_family; #else ADDRESS_FAMILY sa_family; // Address family. #endif //(_WIN32_WINNT < 0x0600) CHAR sa_data[14]; // Up to 14 bytes of direct address. } SOCKADDR, *PSOCKADDR, FAR *LPSOCKADDR;
只是由於CHAR sa_data[14];保存ip與端口過於麻煩,多出的部分補充爲0,因此引用了sockaddr_in來人性化操做。tcp
5.cpu 向內存中保存數據的方式有兩種。函數
大端序:高位字節存放在低位地址。
小端序:高位字節存放在高位地址。
例如: int32 數字1,二進制 00000000 00000000 00000000 00000001
這種就是大端序。
而後小端序是:00000001 00000000 00000000 00000000
由於咱們傳遞的時候實際上傳遞的是信號,也就是二進制。
若是大端號遇到小端號,他們接收的數據正確可是理解是不同的。
因此在傳輸數據的時候約定所有轉換成大端序。
因此有了下面幾個函數:code
unsigned short htons(unsigned short); unsigned short ntohs(unsigned short); unsigned long htonl(unsigned long); unsigned long htonl(unsigned long);
h:主機字節序
t:to
n:網絡字節序
s:short
l:long
之因此有long,由於long在linux 中爲4個字節,能夠用來轉換ip
htons 用來轉換端口。
因此傳輸地址爲:server
serverAddr.sin_family = AF_INET; serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); serverAddr.sin_port = htons(atoi(argv[1]));
INADDR_ANY是一個自動獲取的內部ip,好比說127.0.0.1,這只是針對只有一個ip地址的狀況,若是本身內部虛擬了網絡,那麼這個最後去手動填寫。
實際過程當中咱們賦值是:tcp-ip
addr='127.0.0.1' inet_aton(addr,&addr_inet.sin_addr);
功能以下:好比說咱們寫地址的時候是:127.0.0.1
那麼這個時候其實咱們必須轉換爲32位的int類型,也就是32byte。
inet_aton就是用來轉換的,避免咱們手動計算。ip