【c++】sockaddr,sockaddr_in

struct sockaddr和struct sockaddr_in这两个结构体用来处理网络通信的地址。在各种系统调用或者函数中,只要和网络地址打交道,就得用到这两个结构体。网络中的地址包含3个方面的属性:
1 地址类型; 2 ip地址; 3 端口

上图看结构:

#include <sys/in.h>

这里写图片描述

#include <sys/socket.h>

这里写图片描述

#include <sockaddr.h>

这里写图片描述

我们从这个宏定义开始,可以看到宏__SOCKADDR_COMMON事实上是声明一个变量,类型是unsigned short int,sa_prefix是变量名的前缀,宏的##表示连接的意思,即family作为变量名的后半部分,所以我们在socket编程的时候是为变量sin_family赋值。
另外宏里面还可以使用#,表示把宏参数变为一个字符串。

讲解了宏__SOCKADDR_COMMON的含义,sockaddr和sockaddr_in的结构内容相信大家都能看懂,我们注意一下,sockaddr和sockaddr_in第一个变量都是用2字节存放地址类型,区别在于sockaddr_in第二个和第三个变量端口号和地址,第四个变量是字节填充,而sockaddr只剩下第二个变量放置data,可以看到这两个结构体的长度是一样的。

在平常编程中把类型、ip地址、端口填充sockaddr_in结构体,然后强制转换成sockaddr,作为参数传递给系统调用函数。
这里写图片描述

sockaddr常用于bind、connect、recvfrom、sendto等函数的参数,指明地址信息。是一种通用的套接字地址。而sockaddr_in是internet环境下套接字的地址形式。所以在网络编程中我们会对sockaddr_in结构体进行操作。使用sockaddr_in来建立所需的信息,最后使用类型转化就可以了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章