sockaddr和sockaddr sockaddrin和sockaddr

struct sockaddr和struct sockaddr_in这两个结构体用来处理网络通信的地址。

在各种系统调用或者函数中,只要和网络地址打交道,就得用到这两个结构体。

网络中的地址包含3个方面的属性:

1 地址类型: ipv4还是ipv6

2 ip地址

sockaddr和sockaddr sockaddrin和sockaddr
3 端口

相应的,头文件有如下定义:

C代码

include<netinet/in.h>

structsockaddr{

unsignedshortsa_family;//2bytesaddressfamily,AF_xxx

charsa_data[14];//14bytesofprotocoladdress

};

//IPv4AF_INETsockets:

structsockaddr_in{

shortsin_family;//2bytese.g.AF_INET,AF_INET6

unsignedshortsin_port;//2bytese.g.htons(3490)

structin_addrsin_addr;//4bytesseestructin_addr,below

charsin_zero[8];//8byteszerothisifyouwantto

};

structin_addr{

unsignedlongs_addr;//4bytesloadwithinet_pton()

};

include <netinet/in.h>struct sockaddr {unsigned short sa_family; // 2 bytes address family, AF_xxxchar sa_data[14]; // 14 bytes of protocol address};// IPv4 AF_INET sockets:struct sockaddr_in {short sin_family; // 2 bytes e.g. AF_INET, AF_INET6unsigned short sin_port; // 2 bytes e.g. htons(3490)struct in_addr sin_addr; // 4 bytes see struct in_addr, belowchar sin_zero[8]; // 8 bytes zero this if you want to};struct in_addr {unsigned long s_addr; // 4 bytes load with inet_pton()};

注释中标明了属性的含义及其字节大小,这两个结构体一样大,都是16个字节,而且都有family属性,不同的是:

sockaddr用其余14个字节来表示sa_data,而sockaddr_in把14个字节拆分成sin_port, sin_addr和sin_zero

分别表示端口、ip地址。sin_zero用来填充字节使sockaddr_in和sockaddr保持一样大小。

sockaddr和sockaddr_in包含的数据都是一样的,但他们在使用上有区别:

程序员不应操作sockaddr,sockaddr是给操作系统用的

程序员应使用sockaddr_in来表示地址,sockaddr_in区分了地址和端口,使用更方便。

一般的用法为:

程序员把类型、ip地址、端口填充sockaddr_in结构体,然后强制转换成sockaddr,作为参数传递给系统调用函数

网络编程中一段典型的代码为:

C代码

intsockfd;

structsockaddr_inservaddr;

sockfd=Socket(AF_INET,SOCK_STREAM,0);

/*填充structsockaddr_in*/

bzero(&servaddr,sizeof(servaddr));

servaddr.sin_family=AF_INET;

servaddr.sin_port=htons(SERV_PORT);

inet_pton(AF_INET,"127.0.0.1",&servaddr.sin_addr);

/*强制转换成structsockaddr*/

connect(sockfd,(structsockaddr*)&servaddr,sizeof(servaddr));

int sockfd;struct sockaddr_in servaddr;sockfd = Socket(AF_INET, SOCK_STREAM, 0);/* 填充struct sockaddr_in */bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(SERV_PORT);inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);/* 强制转换成struct sockaddr */connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr));

  

爱华网本文地址 » http://www.413yy.cn/a/25101011/88502.html

更多阅读

美国的左派和右派 左派和右派

     左和右是客观存在的现象,这种划分最初是根据座位来划分的,来自法国大革命时期,在议会中左派座在左边,右派座在右边。这种现象在现实中也得到了验证,对此左派和右派都认识到了这个现象,而且感觉这个现象非常神奇,其实也是可以解释

严介和 严介和称其发家史上无“原罪”

       严介和 1960年生于江苏淮安。   1995年,注册成立江苏太平洋工程有限公司,任董事长;第二年6月完成“集团”更名登记,注册资金1.05亿元,任董事局主席兼总裁。2002年,注册成立中国太平洋建设集团有限公司,任董事局

严介和 严介和细说是是非非

“严介和”是近期出现在媒体频率最高的人之一,他的财富、他积累财富的速度、他的手段无一不被人猜测、质疑。严介和到底怎么想?他接受了本报记者的专访——   记者李丰林 南京报道   2003年12月,记者第一次与严介和对话,听他高谈

加盟和代理有什么区别 直销、加盟和代理有和区别?

关于直销、加盟和代理    ,直销好还是加盟好呢,为什么有的厂商选择直销,有的选择加盟或代理呢?还有加盟与代理之间又有什么区别呢?    就加盟与代理而言,加盟的概念是加盟方投入货款资金,公司提供品牌与货源,以店面的形式来操作,面

面试技巧和注意事项 和批发商打交道的10大注意事项

1、注意个人形象,要有老板像,说话有水平,不说行外话;2、了解批发商的性格,投其所好,和他交朋友,可以得更多价位上的和调换货的好处;3、就算没有钱,也要装成大款,至少是成功商人的样子,才会受人尊敬,说话要有底气,别人才不会小看;4、凡事不要

声明:《sockaddr和sockaddr sockaddrin和sockaddr》为网友白雾少年分享!如侵犯到您的合法权益请联系我们删除