socket程式設計 sockaddr_in 和sockaddr和in_addr詳解【轉】
sockaddr
sockaddr 是通用的socket地址,具體到Internet socket,用下面的結構,二者可以進行型別轉換
sa_family是地址家族,一般都是“AF_xxx”的形式。通常大多用的是都是AF_INET,代表TCP/IP協議族
sa_data是14位元組協議地址。
此資料結構用做bind、connect、recvfrom、sendto等函式的引數,指明地址資訊。但一般程式設計中並不直接針對此資料結構操作,而是使用另一個與sockaddr等價的資料結構
struct hostent {
char *h_name; /* 主機的官方域名 */
char **h_aliases; /* 一個以NULL結尾的主機別名陣列 */
int h_addrtype; /* 返回的地址型別,在Internet環境下為AF-INET */
int h_length; /* 地址的位元組長度 */
char **h_addr_list; /* 一個以0結尾的陣列,包含該主機的所有地址*/
};
#define h_addr h_addr_list[0] /*在h-addr-list中的第一個地址*/
struct sockaddr {
unsigned short sa_family; // address family, AF_xxx
char sa_data[14]; // 14 bytes of protocol address
};
sockaddr_in
通常的用法是:
int sockfd;
struct sockaddr_in my_addr;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(MYPORT);
my_addr.sin_addr.s_addr = inet_addr("192.168.0.1");
bzero(&(my_addr.sin_zero), 8);
bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));
struct sockaddr_in {
short int sin_family; // Address family
unsigned short int sin_port; // Port number
struct in_addr sin_addr; /* Internet address */
unsigned char sin_zero[8]; /* Same size as struct sockaddr */
};
in_addr
struct in_addr {
union {
struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
struct { u_short s_w1,s_w2; } S_un_w;
u_long S_addr;
} S_un;
#define s_addr S_un.S_addr
struct in_addr就是32位IP地址
sin_family指代協議族,在socket程式設計中只能是AF_INET
sin_port儲存埠號(使用網路位元組順序)
sin_addr儲存IP地址,使用in_addr這個資料結構
sin_zero是為了讓sockaddr與sockaddr_in兩個資料結構保持大小相同而保留的空位元組。
s_addr按照網路位元組順序儲存IP地址
sockaddr_in和sockaddr是並列的結構,指向sockaddr_in的結構體的指標也可以指向
sockaddr的結構體,並代替它。也就是說,你可以使用sockaddr_in建立你所需要的資訊,
然後用進行型別轉換就可以了bzero((char)&mysock,sizeof(mysock));//初始化
sockaddr_in mysock;
bzero((char)&mysock,sizeof(mysock));
mysock.sa_family=AF_INET;
mysock.sin_port=htons(1234);//1234是埠號
mysock.sin_addr.s_addr=inet_addr("192.168.0.1");
inet_addr()是將一個點分制的IP地址(如192.168.0.1)轉換為上述結構中需要的32位IP地址(0xC0A80001)。
muahao@aliyun.com
相關文章
- PHP Socket 程式設計詳解PHP程式設計
- IO和socket程式設計程式設計
- 【網路程式設計】socket詳解程式設計
- Java 網路程式設計 —— Socket 詳解Java程式設計
- PHP Socket 程式設計過程詳解PHP程式設計
- 非同步 SOCKET 程式設計 - 傳送和接收資料 (轉)非同步程式設計
- Socket程式設計中的同步、非同步、阻塞和非阻塞(轉)程式設計非同步
- Java網路程式設計和NIO詳解1:JAVA 中原生的 socket 通訊機制Java程式設計
- 【Socket程式設計】【第一節】【Socket基本原理和套接字】程式設計
- 網路協議之:socket協議詳解之Socket和Stream Socket協議
- Socket send函式和recv函式詳解函式
- SOCKET程式設計程式設計
- MFC下CSocket程式設計詳解(轉)程式設計
- 玩轉 PHP 網路程式設計全套之 socket stream 程式設計PHP程式設計
- socket程式設計(1)程式設計
- Java Socket程式設計Java程式設計
- Java Socket程式設計Java程式設計
- WCF、Socket程式設計程式設計
- Socket程式設計(九)程式設計
- Socket程式設計模型程式設計模型
- JS非同步程式設計之Promise詳解和使用總結JS非同步程式設計Promise
- Java網路程式設計和NIO詳解6:Linux epoll實現原理詳解Java程式設計Linux
- Java網路程式設計和NIO詳解3:IO模型與Java網路程式設計模型Java程式設計模型
- 詳細講解DirectDraw程式設計基礎(轉)程式設計
- liunx程式設計之const使用詳解(轉)程式設計
- Java網路程式設計和NIO詳解5:Java 非阻塞 IO 和非同步 IOJava程式設計非同步
- 如何學習程式設計和轉行程式設計
- Python socket程式設計Python程式設計
- Socket程式設計基礎程式設計
- socket程式設計實戰程式設計
- Socket網路程式設計程式設計
- Socket 程式設計實戰程式設計
- Java Socket 程式設計指南Java程式設計
- linux Socket 程式設計Linux程式設計
- 網路程式設計-socket程式設計
- Nginx支援Socket轉發過程詳解Nginx
- 裝備屬性欄位設計和投放詳解
- 好程式設計師分享JS節流和防抖的區分和實現詳解程式設計師JS