我明白了为什么将sockaddr投射到sockaddr_in是有用的,但是我不明白这是如何实现的。 从我读过的,他们是相同的大小和sockaddr_in添加sin_zero使其相同的大小。 我想知道如果编译器知道从sockaddr_in获取信息的方式是否与sockaddr_in不同,
WinSock.h和WinSock2.h哪个使用?
用C / C ++(GCC / G ++)在Linux下的套接字编程中发送和接收文件
太多的TIME_WAIT连接,得到“无法分配请求的地址”
使用asynchronousI / O和IOCP实现回显服务器的最佳方式是什么?
这是可能的,因为你通常投了指针,而不是结构本身。 你做自然语言的意思是“请把这个指针作为指向internet socket structure的指针来对待internet socket structure ”。 编译器没有任何问题来重新解释指针。
这里是从评论中采取更详细的描述:
一个sockaddr大小是16个字节,前两个字节是sa_family ,剩下的14个字节是sa_data ,它是任意数据。 sockaddr_in大小也是16字节 – 前2个字节是sin_family (总是AF_INET ),接下来的2个字节是sin_port ,接下来的4个字节是sin_addr (IP地址),最后8个字节是sin_zero没有在IPv4中使用,只提供16个字节。 这样,你可以先看看sockaddr.sa_family ,如果是AF_INET那么把整个sockaddr解释为sockaddr_in 。
sockaddr_in不存储在sockaddr.sa_data字段中。 整个sockaddr是整个sockaddr_in (当sockaddr.sa_family是AF_INET时,就是这样)。 如果你拿一个sockaddr*指针并把它转换成一个sockaddr_in*指针,那么:
sockaddr.sa_family是sockaddr_in.sin_family
sockaddr.sa_data字节0-1是sockaddr_in.sin_port
字节2-5是sockaddr_in.sin_addr
字节6-13是sockaddr_in.sin_zero 。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。