Linux C中sockaddr和sockaddr_in的区别
Linux C中sockaddr和sockaddr_in的区别 struct sockaddr和struct sockaddr_in这两个结构体用来处理网络通信的地址。 在各种系统调用或者函数中,只要和网络地址打交道,就得用到这两个结构体。 网络中的地址包含3个方面的属性: 1 地址类型: ipv4还是ipv6 相应的,头文件有如下定义: include <netinet/in.h> struct sockaddr { unsigned short sa_family; // 2 bytes address family,AF_xxx char 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_INET6 unsigned short sin_port; // 2 bytes e.g. htons(3490) struct in_addr sin_addr; // 4 bytes see struct in_addr,below char 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,作为参数传递给系统调用函数 网络编程中一段典型的代码为: 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)); 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- shell – .sh文件未找到
- angularjs – 在IE8中多次调用$routeChangeStart
- Axis调用webservice查看天气情况(固定地区)
- Bootstrap3 多个模态对话框无法显示的问题
- 如何在visual studio 2017 ver 15.3.2中暂时禁用asp.net co
- Bootstrap不会检测jQuery 1.11.0 – 未捕获错误:Bootstrap
- 使用类似eval()的函数在Vim中设置变量
- 图像处理 – 如何在Angular JS中更改src后刷新图像
- scala – 我的Play 2应用程序如何响应客户端的不同“Accept
- bootstrap modal弹出框的垂直居中