重溫網絡編程——常識(三)

前言

關於一些網絡編程的常識整理。linux

正文

1.網絡數據傳輸到咱們的計算機,是如何知道傳輸給那個應用?
經過端口,因此端口也是不能重複佔用的。編程

  1. 下面是sockaddr_in 的定義:
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服務器(非特權)端口,用來給用戶自定義端口.服務器

  1. 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;網絡

    define s_addr S_un.S_addr /* can be used for most tcp & ip code */

    define s_host S_un.S_un_b.s_b2 // host on imp

    define s_net S_un.S_un_b.s_b1 // network

    define s_imp S_un.S_un_w.s_w2 // imp

    define s_impno S_un.S_un_b.s_b4 // imp

    define s_lh S_un.S_un_b.s_b3 // logical host

    } IN_ADDR, PIN_ADDR, FAR LPIN_ADDR;
  2. sin_zero
    只是爲了sock_addr_in 的大小與sockaddr 結構體保持一致插入的成員。
    下面是sockadrr 的聲明:
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

相關文章
相關標籤/搜索