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
相關文章
- 【網路程式設計】socket詳解程式設計
- Java 網路程式設計 —— Socket 詳解Java程式設計
- Java網路程式設計和NIO詳解1:JAVA 中原生的 socket 通訊機制Java程式設計
- 【Socket程式設計】【第一節】【Socket基本原理和套接字】程式設計
- 網路協議之:socket協議詳解之Socket和Stream Socket協議
- MFC下CSocket程式設計詳解(轉)程式設計
- 玩轉 PHP 網路程式設計全套之 socket stream 程式設計PHP程式設計
- SOCKET程式設計程式設計
- Java網路程式設計和NIO詳解6:Linux epoll實現原理詳解Java程式設計Linux
- Java Socket程式設計Java程式設計
- socket程式設計(1)程式設計
- Socket程式設計模型程式設計模型
- Python socket程式設計Python程式設計
- JS非同步程式設計之Promise詳解和使用總結JS非同步程式設計Promise
- Java網路程式設計和NIO詳解3:IO模型與Java網路程式設計模型Java程式設計模型
- Python中兩種網路程式設計方式:Socket和HTTP協議Python程式設計HTTP協議
- Socket程式設計基礎程式設計
- socket網路程式設計程式設計
- 網路程式設計-socket程式設計
- socket程式設計實戰程式設計
- Java網路程式設計和NIO詳解5:Java 非阻塞 IO 和非同步 IOJava程式設計非同步
- Java網路程式設計和NIO詳解9:基於NIO的網路程式設計框架NettyJava程式設計框架Netty
- Boost.Asio和ACE之間關於Socket程式設計的比較程式設計
- 好程式設計師分享JS節流和防抖的區分和實現詳解程式設計師JS
- 好程式設計師Python培訓分享Python中程式和執行緒詳解程式設計師Python執行緒
- 網路程式設計之socket程式設計
- 【socket程式設計基礎模板】程式設計
- python:socket網路程式設計Python程式設計
- select函式socket程式設計函式程式設計
- golang中的socket程式設計Golang程式設計
- 好程式設計師教程分享Java註解和運用註解程式設計程式設計師Java
- 玩轉 PHP 網路程式設計全套之 socket 選項設定 APIPHP程式設計API
- Java網路程式設計與NIO詳解8:淺析mmap和Direct BufferJava程式設計
- Linux Socket C語言網路程式設計:TCP SocketLinuxC語言程式設計TCP
- Linux Socket C語言網路程式設計:UDP SocketLinuxC語言程式設計UDP
- Linux Socket C語言網路程式設計:Select SocketLinuxC語言程式設計
- 裝備屬性欄位設計和投放詳解
- 四、GO程式設計模式:委託和反轉控制Go程式設計設計模式