sockaddr和sockaddr_in的区别
From: http://www.it165.net/pro/html/201211/4066.html
初學者很容易對二者有困惑的感覺,下面來講一下二者的區別。
sockaddr是在頭文件 /usr/include/bits/socket.h 中定義的,如下:
?
view sourceprint? 1.struct sockaddr 2.{ 3.__SOCKADDR_COMMON (sa_);??? /* Common data: address family and length.? 協議族*/ 4.char sa_data[14];?????? /* Address data.? 地址+端口號*/ 5.};
?
而sockaddr_in是在頭文件 /usr/include/netinet/in.h 中定義的,如下:
?
view sourceprint? 01./* Structure describing an Internet socket address.? */ 02.struct sockaddr_in 03.{ 04.__SOCKADDR_COMMON (sin_);?????????? /* 協議族 */ 05.in_port_t sin_port;???????? /* Port number. 端口號 */ 06.struct in_addr sin_addr;??????? /* Internet address. IP地址 */ 07.? 08./* Pad to size of `struct sockaddr'.? 用于填充的0字節 */ 09.unsigned char sin_zero[sizeof (struct sockaddr) - 10.__SOCKADDR_COMMON_SIZE - 11.sizeof (in_port_t) - 12.sizeof (struct in_addr)]; 13.}; 14.? 15./* Internet address. */ 16.typedef uint32_t in_addr_t; 17.struct in_addr 18.{ 19.in_addr_t s_addr; 20.};
?
二者的占用的內存大小是一致的,因此可以互相轉化,從這個意義上說,他們并無區別。
sockaddr常用于bind、connect、recvfrom、sendto等函數的參數,指明地址信息。是一種通用的套接字地址。而sockaddr_in 是internet環境下套接字的地址形式。所以在網絡編程中我們會對sockaddr_in結構體進行操作。使用sockaddr_in來建立所需的信息,最后使用類型轉化就可以了。下面是一個完整的例子。
?
view sourceprint? 01.#include <stdio.h> 02.#include <stdlib.h> 03.#include <sys/socket.h> 04.#include <netinet/in.h> 05.? 06.int main(int argc,char **argv) 07.{ 08.int sockfd; 09.struct sockaddr_in mysock; 10.? 11.sockfd = socket(AF_INET,SOCK_STREAM,0);? //獲得fd 12.? 13.bzero(&mysock,sizeof(mysock));? //初始化結構體 14.mysock.sin_family = AF_INET;? //設置地址家族 15.mysock.sin_port = htons(800);? //設置端口 16.mysock.sin_addr.s_addr = inet_addr("192.168.1.0");? //設置地址 17.bind(sockfd,(struct sockaddr *)&mysock,sizeof(struct sockaddr); /* bind的時候進行轉化 */ 18.... ... 19.return 0; 20.}
?
題外話,兩個函數 htons() 和 inet_addr()。
htons()作用是將端口號由主機字節序轉換為網絡字節序的整數值。(host to net)
inet_addr()作用是將一個IP字符串轉化為一個網絡字節序的整數值,用于sockaddr_in.sin_addr.s_addr。
inet_ntoa()作用是將一個sin_addr結構體輸出成IP字符串(network to ascii)。比如:
?
view sourceprint? 1.printf("%s",inet_ntoa(mysock.sin_addr));
?
htonl()作用和htons()一樣,不過它針對的是32位的,而htons()針對的是兩個字節,16位的。
與htonl()和htons()作用相反的兩個函數是:ntohl()和ntohs()。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的sockaddr和sockaddr_in的区别的全部內容,希望文章能夠幫你解決所遇到的問題。