Jam*_*ith 2 c c++ sockets parameter-passing
当被问到诸如"什么是价值结果论证以及为什么在套接字编程中需要它?"这样的问题时,我有点困惑.
尽管在这里阅读了无数页面和其他问题,但我仍在努力完全理解价值结果的确切含义.
我的理解是在一个值结果参数中,内核能够对传递的参数进行更改(因为我们给它一个引用/指针,而不仅仅是它的值)并将它返回给调用它的进程/函数.调用函数时它既是一个"值"(告诉内核结构的大小,所以它不会写太多,例如)和函数返回时的结果(我们实际在结构中写了多少).
我正在努力回答的问题是,为什么这在套接字编程中如此重要?特别是,当我们处理sockaddrStructs并将它们的引用和大小传递给它时,即accept()
我意识到这个问题可能听起来有些愚蠢,但对此的任何澄清都会很棒,所以提前感谢.
你有正确的认识是什么一个值结果参数.您将输入值分配给变量并通过引用传递它,以便该函数可以使用输出值修改变量.这节省了必须为输出传递单独的参数,或者更改函数返回值的语义.
的原因,这是所需要的sockaddr参数是因为不同的传输实现不同的sockaddr_...结构,其具有不同的尺寸和布局(sockaddr_in对于IPv4,sockaddr_in6IPv6的,sockaddr_un用于UNIX域套接字等).大多数平台还提供sockaddr_storage结构的实现,其大小足以容纳所有其他sockaddr_...结构,并且在编写多传输代码时非常有用.
因此,在这种情况下accept(),您必须传入将接收客户端的缓冲区的FULL大小sockaddr_....当新客户端到达时,accept()将验证缓冲区是否足够大以接收客户端的实际sockaddr_...数据,然后填充缓冲区,并将返回实际填充的缓冲区数量.
例如,如果您知道套接字仅支持IPv4(创建为 - AF_INET家庭套接字),那么您可以使用a sockaddr_in作为缓冲区和sizeof(sockaddr_in)缓冲区大小,或者您可以使用a sockaddr_storage作为缓冲区和sizeof(sockaddr_storage)缓冲区大小.在任何一种情况下,accept()都会用a填充缓冲区sockaddr_in并返回缓冲区大小为sizeof(sockaddr_in).与仅使用IPv6的套接字(创建为 - AF_INET6家庭套接字)相同sockaddr_in6.
现在,假设您有一个支持IPv4和IPv6的AF_INET6双栈套接字(IPV6_V6ONLY禁用该选项的家庭套接字).您可以使用a sockaddr_storage作为缓冲区和sizeof(sockaddr_storage)缓冲区大小,并accept()使用sockaddr_in或填充缓冲区sockaddr_in6并返回适当的缓冲区大小,具体取决于是接受IPv4还是IPv6客户端.然后,您可以读取该ss_family字段sockaddr_storage并将数据类型转换为sockaddr_infor AF_INET或sockaddr_in6for AF_INET6.
| 归档时间: |
|
| 查看次数: |
1167 次 |
| 最近记录: |