如何在Linux里查看一个结构体的定义, 比如 struct sockaddr nl_in 有没有类似man

下次自动登录
现在的位置:
& 综合 & 正文
sockaddr 和 sockaddr_in的区别
初学者很容易对二者有困惑的感觉,下面来讲一下二者的区别。
sockaddr是在头文件 /usr/include/bits/socket.h 中定义的,如下:
struct sockaddr
__SOCKADDR_COMMON (sa_);
char sa_data[14];
struct sockaddr
__SOCKADDR_COMMON (sa_); /* Common data: address family and length.
char sa_data[14];
/* Address data.
地址+端口号*/
而sockaddr_in是在头文件 /usr/include/netinet/in.h 中定义的,如下:
struct sockaddr_in
__SOCKADDR_COMMON (sin_);
in_port_t sin_
struct in_addr sin_
unsigned char sin_zero[sizeof (struct sockaddr) -
__SOCKADDR_COMMON_SIZE -
sizeof (in_port_t) -
sizeof (struct in_addr)];
typedef uint32_t in_addr_t;
struct in_addr
in_addr_t s_
/* Structure describing an Internet socket address.
struct sockaddr_in
__SOCKADDR_COMMON (sin_);
/* 协议族 */
in_port_t sin_
/* Port number. 端口号 */
struct in_addr sin_
/* Internet address. IP地址 */
/* Pad to size of `struct sockaddr'.
用于填充的0字节 */
unsigned char sin_zero[sizeof (struct sockaddr) -
__SOCKADDR_COMMON_SIZE -
sizeof (in_port_t) -
sizeof (struct in_addr)];
/* Internet address. */
typedef uint32_t in_addr_t;
struct in_addr
in_addr_t s_
二者的占用的内存大小是一致的,因此可以互相转化,从这个意义上说,他们并无区别。
sockaddr常用于bind、connect、recvfrom、sendto等函数的参数,指明地址信息。是一种通用的套接字地址。而sockaddr_in 是internet环境下套接字的地址形式。所以在网络编程中我们会对sockaddr_in结构体进行操作。使用sockaddr_in来建立所需的信息,最后使用类型转化就可以了。下面是一个完整的例子。
#include &stdio.h&
#include &stdlib.h&
#include &sys/socket.h&
#include &netinet/in.h&
int main(int argc,char **argv)
struct sockaddr_
sockfd = socket(AF_INET,SOCK_STREAM,0);
bzero(&mysock,sizeof(mysock));
mysock.sin_family = AF_INET;
mysock.sin_port = htons(800);
mysock.sin_addr.s_addr = inet_addr("192.168.1.0");
bind(sockfd,(struct sockaddr *)&mysock,sizeof(struct sockaddr);
#include &stdio.h&
#include &stdlib.h&
#include &sys/socket.h&
#include &netinet/in.h&
int main(int argc,char **argv)
struct sockaddr_
sockfd = socket(AF_INET,SOCK_STREAM,0);
bzero(&mysock,sizeof(mysock));
//初始化结构体
mysock.sin_family = AF_INET;
//设置地址家族
mysock.sin_port = htons(800);
//设置端口
mysock.sin_addr.s_addr = inet_addr("192.168.1.0");
//设置地址
bind(sockfd,(struct sockaddr *)&mysock,sizeof(struct sockaddr); /* bind的时候进行转化 */
题外话,两个函数 htons() 和 inet_addr()。
htons()作用是将端口号由主机字节序转换为网络字节序的整数值。(host to net)
inet_addr()作用是将一个IP字符串转化为一个网络字节序的整数值,用于sockaddr_in.sin_addr.s_addr。
inet_ntoa()作用是将一个sin_addr结构体输出成IP字符串(network to ascii)。比如:
printf("%s",inet_ntoa(mysock.sin_addr));
printf("%s",inet_ntoa(mysock.sin_addr));
htonl()作用和htons()一样,不过它针对的是32位的,而htons()针对的是两个字节,16位的。
与htonl()和htons()作用相反的两个函数是:ntohl()和ntohs()。
&&&&推荐文章:
【上篇】【下篇】在linux环境下,结构体struct sockaddr在/usr/include/linux/socket.h中定义,具体如下:typedef unsigned short sa_family_t;struct sockaddr {&&&&&&& sa_family_t&&&& sa_&&& /* address family, AF_xxx&&&&&& */&&&&&&& char&&&&&&&&&&& sa_data[14];&&& /* 14 bytes of protocol address */在linux环境下,结构体struct sockaddr_in在/usr/include/netinet/in.h中定义,具体如下:/* Structure describing an Internet socket address. */struct sockaddr_in{&&& __SOCKADDR_COMMON (sin_);&&& in_port_t sin_&&&&&&&&&&&&&&&&&&&& /* Port number. */&&& struct in_addr sin_&&&&&&&&&&& /* Internet address. */&&& /* Pad to size of `struct sockaddr'. */&&& unsigned char sin_zero[sizeof (struct sockaddr) -&&&&&&&&&&&&&&&&&&&&&&&&&& __SOCKADDR_COMMON_SIZE -&&&&&&&&&&&&&&&&&&&&&&&&&& sizeof (in_port_t) -&&&&&&&&&&&&&&&&&&&&&&&&&& sizeof (struct in_addr)];&&&& &&&&&&&&&&&&&&&&&&&&&&&&&& /* 字符数组sin_zero[8]的存在是为了保证结构体struct sockaddr_in的大小和结构体struct sockaddr的大小相等 */};struct sockaddr是通用的套接字地址,而struct sockaddr_in则是internet环境下套接字的地址形式,二者长度一样,都是16个字节。二者是并列结构,指向sockaddr_in结构的指针也可以指向sockaddr。一般情况下,需要把sockaddr_in结构强制转换成sockaddr结构再传入系统调用函数中。下面是struct sockaddr_in中用到两个数据类型,具体定义如下:/* Type to represent a port. */typedef uint16_t in_port_t; struct in_addr其实就是32位IP地址struct in_addr {&&&&&&& unsigned long s_};BSD网络软件中包含了两个函数,用来在二进制地址格式和点分十进制字符串格式之间相互转换,但是这两个函数仅仅支持IPv4。&&&&&& in_addr_t inet_addr(const char *cp);&&&&&& char *inet_ntoa(struct in_addr in);功能相似的两个函数同时支持IPv4和IPv6&&&&&& const char *inet_ntop(int domain, const void *addr, char *str, socklen_t size);&&& && int inet_pton(int domain, const char *str, void *addr);通常的用法是:struct sockaddr_in my_sockfd = socket(AF_INET, SOCK_STREAM, 0); my_addr.sin_family = AF_INET; /* 主机字节序 */my_addr.sin_port = htons(MYPORT); /* short, 网络字节序 */my_addr.sin_addr.s_addr = inet_addr("192.168.0.1");bzero(&(my_addr.sin_zero), 8); /* zero the rest of the struct *///memset(&my_addr.sin_zero, 0, 8);bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));
#define UNIX_PATH_MAX 108& struct sockaddr_un {& sa_family_t sun_ /*PF_UNIX或AF_UNIX */& char sun_path[UNIX_PATH_MAX]; /* 路径名 */& };struct sockaddr结构类型是用来保存socket信息的:   struct sockaddr {   unsigned short sa_ /* 地址族, AF_xxx */&&地址的格式& char sa_data[14]; /* 14 字节的协议地址 */&&地址值(IP和端口号)& };
Sockfd是调用socket函数返回的socket描述符,my_addr是一个指向包含有本机IP地址及端口号等信息的sockaddr类型的指针;addrlen常被设置为sizeof(struct sockaddr)。   struct sockaddr结构类型是用来保存socket信息的:   struct sockaddr {    unsigned short sa_ /* 地址族, AF_xxx */ char sa_data[14]; /* 14 字节的协议地址 */ };   sa_family一般为AF_INET,代表Internet(TCP/IP)地址族;sa_data则包含该socket的IP地址和端口号。   另外还有一种结构类型:   struct sockaddr_in {    short int sin_ /* 地址族 */    unsigned short int sin_ /* 端口号 */    struct in_addr sin_ /* IP地址 */    unsigned char sin_zero[8]; /* 填充0 以保持与struct sockaddr同样大小 */   };  
 这个结构更方便使用。sin_zero用来将sockaddr_in结构填充到与struct
sockaddr同样的长度,可以用bzero()或memset()函数将其置为零。指向sockaddr_in
的指针和指向sockaddr的指针可以相互转换,这意味着如果一个函数所需参数类型是sockaddr时,你可以在函数调用的时候将一个指向
sockaddr_in的指针转换为指向sockaddr的指针;或者相反。
你只要记住,填值的时候使用sockaddr_in结构,而作为函数的 参数传入的时候转换成sockaddr结构就行了,毕竟都是16个字符 长。
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_ } S_un };
阅读(...) 评论()最简单的有关问题,linux下如何查看某个结构体的定义 - Linux/Unix当前位置:& &&&最简单的有关问题,linux下如何查看某个结构体的定义最简单的有关问题,linux下如何查看某个结构体的定义&&网友分享于:&&浏览:91次最简单的问题,linux下怎么查看某个结构体的定义。最近在学习Linux开发,想知道某些结构体是如何定义的,如stat,timespec,DIR等。有什么通用的方法让我找到结构体的定义?man好像只能查看函数的定义,不能看结构体。------解决方案--------------------一般都在/usr/include某个头文件里面,用grep搜
------解决方案--------------------在 kernel/include/linux 里面的*.h里面吧。你用什么工具在阅读源代码?
------解决方案--------------------
其实有很多结构体定义都能用man命令看到,而且还有详细的各项数据的解释、常见取值、常数定义、等等。关键在于要先知道man哪个函数,比如man lstat
可以看到 struct statman mktime 可以看到 struct tmman readdir可以看到 struct dirent
------解决方案--------------------最直接的就是看man帮助,如果找不到,搜索下头文件,一般在/usr/include下面都有
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有2012年11月 Linux/Unix社区大版内专家分月排行榜第二2011年8月 Linux/Unix社区大版内专家分月排行榜第二2008年10月 C/C++大版内专家分月排行榜第二
2012年8月 Linux/Unix社区大版内专家分月排行榜第三
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。sockaddr&sockaddr_in-中国学网-中国IT综合门户网站-提供健康,养生,留学,移民,创业,汽车等信息
sockaddr&sockaddr_in
来源:互联网 更新时间: 2:22:14 责任编辑:王亮字体:
&struct sockaddr {&&&&&& unsigned short sa_ /* 地址族, AF_xxx */&&&&&& char sa_data[14]; /* 14字节的协议地址*/&& };上面是通用的socket地址,具体到Internet socket,用下面的结构,二者可以进行类型转换struct sockaddr_in { // 专用于TCP/IP端点地址&&&&&& short int sin_ /* 地址族 */&&&&&& unsigned short int sin_ /* 端口号 */&&&&&& struct in_addr sin_ /* Internet地址 */&&&&&& unsigned char sin_zero[8]; /* 与struct sockaddr一样的长度 */&& };当要表示一个TCP/IP通信端点时,应用程序使用struct sockaddr_in,它包含了IP地址和协议端口号。在写混合协议的程序时,一定要注意,因为有些非TCP/IP端点地址需要一个更大的结构。struct in_addr就是32位IP地址。struct in_addr {&&&&&& unsigned long s_&& };
也有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_ } S_};TCP/IP对协议首部中所使用的二进制整数制定了一种标准的表示方式,这种表示方式称为:网络字节顺序,它表示整数时,让最高位在前面。套接字要求参数以网络字节顺序存储。例如,sockaddr_in的协议端口字段就是网络顺序字段。利用u_long htonl(u_long hostlong);将主机字节序转换为TCP/IP网络字节序.ntohl与之相反。利用u_short htons(u_short hostshort);将主机字节序转换为TCP/IP网络字节序.ntohs与之相反。inet_addr()是将一个点分制的IP地址(如192.168.0.1)转换为上述结构中需要的32位IP地址(0xC0A80001)。
相关文章:
上一篇文章:下一篇文章:
最新添加资讯
24小时热门资讯
Copyright © 2004- All Rights Reserved. 中国学网 版权所有
京ICP备号-1 京公网安备02号}

我要回帖

更多关于 struct结构体定义 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信