IPv4套接字地址結構 struct sockaddr_in {uint8_t sinlen;(4個字節)sa_family_t sin_family;(4個字節)in_port_t sin_port;(2個字節)struct in_addr sin_addr;(4個字節)char sin_zero[8]; }; sin_len:整個sockaddr_in結構體的長度,部分Linux內核版本沒有該成員 sin_family:指定該地址家族,一般設置為AF_INET(使用TCP,UDP協議) sin_port:端口 sin_addr:IPv4的地址 sin_zero:暫不使用,一般將其設置為0通用地址結構 struct sockaddr {uint8_t sin_len;(4個字節)sa_family_t sin_family;(4個字節)char sa_data[14]; }; sin_len:整個sockaddr結構的長度 sin_family:指定該地址家族 sa_data:由sin_family決定它的形式結論:struct sockaddr_in與struct sockaddr結構大小相同
字節序 大端字節序 --最高有效位存儲與最低內存地址處,最低有效位存儲于最高內存地址處小端字節序 --最高有效位存儲于最高內存地址處,最低有效位存儲于最低內存地址處主機字節序 --不同主機有不同的字節序,如x86小端字節序,,Motorola 6800為大端字節序網絡字節序 --網絡字節序規定為大端字節序字節序說明:一個int類型變量254存儲在內存中,如果變量的百位存儲于內存地址條上的低地址處,
個位存儲于內存地址條上的高地址處(即變量存儲序列和內存地址序列相反)這就是大端字節序,反之則是小端字節序。
各個主機的字節序是不同的,但是在網絡中傳輸,必須要一個統一的字節序,這就是網絡字節序。
字節序轉換函數
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
說明:在上述函數中,h代表host;n代表networks;s代表short;l代表long。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <sys/types.h> #include <arpa/inet.h>int main(int arg, char *args[]) {unsigned int data = 0x12345678;char *p = (char *)&data;printf("%x,%x,%x,%x\n", p[0], p[1], p[2], p[3]);/** 對于數組而言,內存地址一定是遞增的,p[0]=*(p+0);p[1]=*(p+1);* 如果data變量的最低有效位處于p+0這個低內存地址位,說明這是小端字節序* */if (p[0] == 0x78){printf("主機是小端字節序\n");} else{printf("主機是大端字節序\n");}//字節序轉換函數uint32_t ndata = htonl(data);p = (char *)&ndata;printf("%x,%x,%x,%x\n", p[0], p[1], p[2], p[3]);if (p[0] == 0x78){printf("網絡字節序是小端字節序\n");} else{printf("網絡字節序是大端字節序\n");}return 0; }
地址轉換函數 typedef uint32_t in_addr_t; struct in_addr {in_addr_t s_addr; };int inet_aton(const char *p,struct in_addr *inp); 將點分十進制(192.168.1.116)轉化成struct in_addrin_addr_t inet_addr(const char * cp); 將點分十進制轉化成32bitchar *inet_ntoa(struct in_addr in);//注意:這里參數是結構體變量,而非結構體指針 將struct結構體變量轉化成點分十進制
inet_ntoa()返回值是char *,這個char *的內存空間是在inet_ntoa()函數中靜態分配的,因此inet_ntoa()后面的調用會覆蓋上一次調用,inet_ntoa()是線程不安全函數。
套接字類型 1.流式套接字(SOCK_STREAM) --提供面向連接的,可靠的數據傳輸服務,數據無差錯,無重復的發送,且按發送順序接收。 2.數據報式套接字(SOCK_DGRAM) --提供無連接服務,不提供無錯保證,數據可能丟失或重復,并且接收順序混亂。 3.原始套接字(SOCK_RAW)
?