值-结果参数(socket编程中的函数举例)
Posted 比不了就不比
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了值-结果参数(socket编程中的函数举例)相关的知识,希望对你有一定的参考价值。
我们已经知道,当把套接口地址结构传递给套接口函数时,总是通过指针来传递的,即传递的是一个指向结构的指针。结构的长度也作为参数来传递,其传递方式取决于结构的传递方向:从进程到内核,还是从内核到进程。
1、从进程到内核传递套接口地址结构有3个函数:bind、connect和sendto,这3个函数的一个参数是指向套接口地址结构的指针,另一个是结构的整数大小,例如:
struct sockaddr_in serv;
/* fill in serv */
connect( sockfd, (SA*)&serv, sizeof(serv) );
由于指针和指针所指结构的大小都传递给内核,所以从进程到内核要确切拷贝多少数据是知道的,如图3.7所示。
套接口地址结构大小的数据类型确切地说应该是socklen_t,而不是int,POSIX建议将socklen_t定于为uint32_t。
2、与前面的传递方向相反,从内核到进程传递套接口地址结构有四个函数:accept、recvfrom、getsockname 和 getpeername。这4个函数的两个参数是:指向套接口地址结构的指针和指向表示结构大小的整数的指针,例如:
struct sockaddr_un cli; /* Unix domain */
socklen_t len;
len = sizeof(cli);
getpeername(unixfd, (SA*) &cli, &len )
/* len may have changed */
为何将结构大小由整数改为指向整数的指针呢?这是因为:当函数被调用时,结构大小是一个值(value, 此值告诉内核该结构的大小,使内核在写此结构时不至于越界),当函数返回时,结构大小又是一个结果(result,它告诉进程内核在此结构中确切存储了多少信息),这种参数叫做值-结果参数(value-result)。如图3.8所示。
当使用值-结果参数作为套接口地址结构的长度时,如果套接口地址结构是定长的,则从内核返回的值也是定长的,如对于IPv4,sockaddr_in是16;对于IPv6,sockaddr_in6是28。但对于变长的套接口地址结构(如Unix域的sockaddr_un),返回值可能比结构的最大长度小。
bind、connect从进程到内核传递参数,它明确知道要拷贝多少以及拷贝的数据。因此一般传递一个长度
sendto是从进程到内核传递参数的。
recvfrom是从内核到进程传递参数的。 调用之前,给这个参数一个初值,表示一个最大容量,函数内部会使用这个初值;调用之后,函数会修改这个参数,表示实际使用的空间.
以上是关于值-结果参数(socket编程中的函数举例)的主要内容,如果未能解决你的问题,请参考以下文章