SOCKADDR_IN
生活随笔
收集整理的這篇文章主要介紹了
SOCKADDR_IN
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
在windows/linux下有下面結(jié)構(gòu):
sockaddr結(jié)構(gòu)
struct sockaddr
{
unsigned short sa_family;/*addressfamily,AF_xxx*/
char sa_data[14];/*14bytesofprotocoladdress*/
};
sa_family是地址家族,一般都是“AF_xxx”的形式。通常大多用的是都是AF_INET,代表TCP/IP協(xié)議族。
sa_data是14字節(jié)協(xié)議地址。
此數(shù)據(jù)結(jié)構(gòu)用做bind、connect、recvfrom、sendto等函數(shù)的參數(shù),指明地址信息。但一般編程中并不直接針對此數(shù)據(jù)結(jié)構(gòu)操作,而是使用另一個與sockaddr等價的數(shù)據(jù)結(jié)構(gòu)
sockaddr_in(在netinet/in.h中定義):
struct sockaddr_in{short sin_family;/*Address family一般來說AF_INET(地址族)PF_INET(協(xié)議族)*/unsigned short sin_port;/*Port number(必須要采用網(wǎng)絡(luò)數(shù)據(jù)格式,普通數(shù)字可以用htons()函數(shù)轉(zhuǎn)換成網(wǎng)絡(luò)數(shù)據(jù)格式的數(shù)字)*/struct in_addr sin_addr;/*IP address in network byte order(Internet address)*/unsigned char sin_zero[8];/*Same size as struct sockaddr沒有實際意義,只是為了 跟SOCKADDR結(jié)構(gòu)在內(nèi)存中對齊*/};
(在ws2def.h中定義):
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];
}
(在WinSock2.h中定義):
struct sockaddr_in {short sin_family;u_short sin_port;struct in_addr sin_addr;char sin_zero[8];
};
在linux下:
in_addr結(jié)構(gòu)
typedef uint32_t in_addr_t; struct in_addr{in_addr_t s_addr;}; 在windows下: typedef struct in_addr {union{struct { unsigned char s_b1,s_b2,s_b3,s_b4; } S_un_b;struct { unsigned short s_w1,s_w2; } S_un_w;unsigned long S_addr;}S_un; }in_addr; 更多參考:in_addr 參數(shù)說明編輯 sin_family指代協(xié)議族,在socket編程中只能是AF_INET sin_port存儲端口號(使用網(wǎng)絡(luò)字節(jié)順序),在linux下,端口號的范圍0~65535,同時0~1024范圍的端口號已經(jīng)被系統(tǒng)使用或保留。 sin_addr存儲IP地址,使用in_addr這個數(shù)據(jù)結(jié)構(gòu) sin_zero是為了讓sockaddr與sockaddr_in兩個數(shù)據(jù)結(jié)構(gòu)保持大小相同而保留的空字節(jié)。 s_addr按照網(wǎng)絡(luò)字節(jié)順序存儲IP地址 sockaddr_in和sockaddr是并列的結(jié)構(gòu),指向sockaddr_in的結(jié)構(gòu)體的指針也可以指向 sockaddr的結(jié)構(gòu)體,并代替它。也就是說,你可以使用sockaddr_in建立你所需要的信息, 然后用memset函數(shù)初始化就可以了memset((char*)&mysock,0,sizeof(mysock));//初始化 sockaddr_in mysock; memset((char*)&mysock,0,sizeof(mysock)); mysock.sin_family=AF_INET; mysock.sin_port=htons(1234);//1234是端口號 mysock.sin_addr.s_addr=inet_addr("192.168.0.1"); 相關(guān)函數(shù):inet_addr, inet_aton, inet_ntoa, htonl, htons, MAKEWORD, WSASocket, WSAHtons……
typedef uint32_t in_addr_t; struct in_addr{in_addr_t s_addr;}; 在windows下: typedef struct in_addr {union{struct { unsigned char s_b1,s_b2,s_b3,s_b4; } S_un_b;struct { unsigned short s_w1,s_w2; } S_un_w;unsigned long S_addr;}S_un; }in_addr; 更多參考:in_addr 參數(shù)說明編輯 sin_family指代協(xié)議族,在socket編程中只能是AF_INET sin_port存儲端口號(使用網(wǎng)絡(luò)字節(jié)順序),在linux下,端口號的范圍0~65535,同時0~1024范圍的端口號已經(jīng)被系統(tǒng)使用或保留。 sin_addr存儲IP地址,使用in_addr這個數(shù)據(jù)結(jié)構(gòu) sin_zero是為了讓sockaddr與sockaddr_in兩個數(shù)據(jù)結(jié)構(gòu)保持大小相同而保留的空字節(jié)。 s_addr按照網(wǎng)絡(luò)字節(jié)順序存儲IP地址 sockaddr_in和sockaddr是并列的結(jié)構(gòu),指向sockaddr_in的結(jié)構(gòu)體的指針也可以指向 sockaddr的結(jié)構(gòu)體,并代替它。也就是說,你可以使用sockaddr_in建立你所需要的信息, 然后用memset函數(shù)初始化就可以了memset((char*)&mysock,0,sizeof(mysock));//初始化 sockaddr_in mysock; memset((char*)&mysock,0,sizeof(mysock)); mysock.sin_family=AF_INET; mysock.sin_port=htons(1234);//1234是端口號 mysock.sin_addr.s_addr=inet_addr("192.168.0.1"); 相關(guān)函數(shù):inet_addr, inet_aton, inet_ntoa, htonl, htons, MAKEWORD, WSASocket, WSAHtons……
?
轉(zhuǎn)載于:https://www.cnblogs.com/zzyoucan/p/5143834.html
總結(jié)
以上是生活随笔為你收集整理的SOCKADDR_IN的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android应用开发基础篇(1)---
- 下一篇: 计算机网络之传输层:1、概述(传输层功能