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