- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我知道 sockaddr_in 用于 IPv4,而 sockaddr_in6 用于 IPv6。让我感到困惑的是 sockaddr 和 sockaddr_in[6] 之间的区别。
有些函数接受sockaddr
,有些函数接受sockaddr_in
或sockaddr_in6
,所以:
因为 sizeof(sockaddr_in6) > sizeof(sockaddr) == sizeof(sockaddr_in)
。
一个例子是:我们有一个socket,我们想得到它的字符串ip地址(可以是ipv4或者ipv6)。
我们先调用getsockname
得到一个addr
,然后根据addr.sa_family
调用inet_ntop
。
这段代码有什么问题吗?
char ipStr[256];
sockaddr_in6 addr_inv6;
sockaddr* addr = (sockaddr*)&addr_inv6;
sockaddr_in* addr_in = (sockaddr_in*)&addr_inv6;
socklen_t len = sizeof(addr_inv6);
getsockname(_socket, addr, &len);
if (addr->sa_family == AF_INET6) {
inet_ntop(addr_inv6.sin6_family, &addr_inv6.sin6_addr, ipStr, sizeof(ipStr));
// <<<<<<<<IS THIS LINE VALID, getsockname expected a sockaddr, but we use
// it output parameter as sockaddr_in6.
} else {
inet_ntop(addr_in->sin_family, &addr_in->sin_addr, ipStr, sizeof(ipStr));
}
最佳答案
sockaddr_in
和 sockaddr_in6
都是第一个成员是 sockaddr
的结构结构。
根据C标准,结构的地址和它的第一个成员是相同的,所以你可以将指针转换为sockaddr_in(6)
在指向 sockaddr
的指针中.
函数采用sockaddr_in(6)
作为参数可以修改sockaddr
部分和函数采用 sockaddr
作为参数只关心那部分。
有点像继承。
关于c++ - sockaddr、sockaddr_in 和 sockaddr_in6 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18609397/
因此,我试图读取二进制文件,其中字节以网络字节顺序排列。在文件中,它们包含为套接字编程创建结构sockaddr_in所需的信息。这些文件的排列方式是,前4个字节代表IPv4地址,后2个字节代表端口号(
我想做一个小型的ECHO服务器,但是这段代码在通过sendto时一直返回-1,我不知道为什么。 它总是传递到 perror 并打印地址族不支持谁能解释一下为什么? 这是我的代码: sock = soc
我现在正在用 C 语言创建一个服务器/客户端系统,我在客户端部分遇到了一些麻烦。据我所知,我需要使用 sockaddr_in 才能连接到服务器。但是,我每次都遇到段错误。我相信 sockaddr_in
我正在解决一些静态分析缺陷,而导致我出现问题的就是这个缺陷。 SOCKADDR_IN m_stLclAddr; SOCKADDR_IN is a member of the WinSock API 缺
我有一段代码,很久以前在某个环境下工作过。我很确定它是一台 FreeBSD 机器,所以我得到了 FreeBSD 8.3,我正在尝试制作这个文件,但它不工作。 当我尝试编译它时,它会提示: f.c: I
我正在遵循 beej 的网络指南,它进展得非常好,因为我对所有内容都非常了解,而且他解释得很好。但是,当我想测试他向我展示的一些很酷的东西时,它不会起作用! :( 我不确定 sockaddr_in 到
这是 netinet/in.h 中定义的 internet(IPv4) 套接字地址结构 struct sockaddr_in { uint8_t sin_len; s
作为接收struct ifreq *ifr参数的函数的一部分,如果我声明struct sockaddr_in name;,程序会编译,但如果我命名变量struct sockaddr_in ifr_ad
我正在创建一个小型的发送方和接收方应用程序,它将其名称广播到多播组中的所有其他应用程序,同时还接收其他应用程序的名称。 我想我现在已经完成了发送部分,如下所示: if (sendto(sock, me
目前我正在构建一个点对点网络架构,并且正处于创建一个接收函数的阶段,该函数将接受来自网络上多个客户端的消息。本质上,当 recvfrom 函数被调用时——最近向主客户端发送消息的客户端的地址被加载到一
对于我的一门类(class),我必须对服务器和客户端进行编程,并且我们获得了一些示例代码以供使用。这是我感到困惑的片段: main() { int sock, sock_current, c
我在 C 编程方面相对较新,尤其是在套接字编程方面,但我花了很多时间试图帮助自己解决这个问题,但没有找到任何东西,我希望有人能够提供帮助。所以这就是问题所在(我只写了我有问题的那一行) #includ
在作为connect() 的函数中,最后一个参数是sockaddr_in 结构的大小。 很好,但是 sin_zero 未使用(系统不会像我在 stackoverflow.com/questions/2
如果我需要获取 IP 的主机名,我应该使用哪个端口? getnameinfo() 从哪里获取主机名? struct sockaddr_in sa; sa.sin_family = AF_INET
无论我在哪里看,我都会看到以下代码: struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INE
我尝试使用 struct sockaddr_in sin; 但如果我使用它,我会得到 Variable has incomplete type 'struct sockaddr_in' 和 Forw
我在谷歌上搜索了一下,有人说“为了与 struct sockaddr 保持相同的大小”。但是内核不会直接使用 sockaddr(对吧?)。使用时。内核会将其转换回原来的样子。那么为什么需要零填充? s
var sa_tab:[sockaddr?] = [sockaddr](repeating: sockaddr(), count: Int(RTAX_MAX)) let addr:sockaddr =
我是 C 和套接字编程的新手,仍然在 sockaddr_in 中苦苦挣扎结构体: struct sockaddr_in { short sin_family; /*
当我初始化变量时,我会这样做。 int i = 0; char *myText = NULL; 那么,如何初始化struct sockaddr_in类型变量? struct sockaddr_in a
我是一名优秀的程序员,十分优秀!