c++ - Why do we need Value-Result arguments in socket programming? (Clarification required) -


i little confused when asked question such "what value-result argument , why needed in socket programming?"

i struggling understand value result argument is, despite reading countless pages , other questions on here.

my understanding in value result argument kernel able make changes argument passed(because give reference/pointer it, not value) , return the process/function called it. both "value" when function called(tells kernel size of struct doesn't write example) , result when function returns(how wrote in struct).

what struggling answer, why important in socket programming? in particular, when dealing sockaddr structs , passing reference , size over, i.e. accept()

i realize question may sound silly, clarification on great, in advance.

you have correct understanding of what value-result parameter is. assign input value variable , pass by-reference function can modify variable output value. saves having pass separate parameter output, or change semantics of function's return value.

the reason needed sockaddr parameters because different transports implement different sockaddr_... structures, have different sizes , layouts (sockaddr_in ipv4, sockaddr_in6 ipv6, sockaddr_un unix domain sockets, etc). platforms provide implementation of sockaddr_storage structure, large enough hold other sockaddr_... structs, , useful when writing multi-transport code.

so, in case of accept(), have pass in full size of buffer receive client's sockaddr_.... when new client arrives, accept() validate buffer large enough receive client's actual sockaddr_... data before populating buffer, , return how of buffer filled in.

for example, if know socket supports ipv4 (was created af_inet-family socket), can use sockaddr_in buffer , sizeof(sockaddr_in) buffer size, or can use sockaddr_storage buffer , sizeof(sockaddr_storage) buffer size. in either case, accept() populate buffer sockaddr_in , return buffer size sizeof(sockaddr_in). same ipv6-only socket (created af_inet6-family socket), sockaddr_in6 instead.

now, lets have dual-stack socket supports both ipv4 , ipv6 (an af_inet6-family socket ipv6_v6only option disabled). can use sockaddr_storage buffer , sizeof(sockaddr_storage) buffer size, , accept() populate buffer either sockaddr_in or sockaddr_in6 , return appropriate buffer size, depending on whether ipv4 or ipv6 client accepted. can read ss_family field of sockaddr_storage , type-cast data either sockaddr_in af_inet or sockaddr_in6 af_inet6.


Comments

Popular posts from this blog

Magento/PHP - Get phones on all members in a customer group -

php - .htaccess mod_rewrite for dynamic url which has domain names -

Website Login Issue developed in magento -