UNIX网络编程学习笔记:值-结果(value-result)参数

前言

当把套接口地址结构传递给套接口函数时,总是通过指针来传递的,即传递的是一个指向结构的指针。结构的长度也作为参数来传递,其传递的方式取决于结构的传递方向:从进程到内核,还是从内核到进程。

1、从进程到内核

从进程到内核传递套接口地址结构的函数有3个:bind、connect和sendto,这3个函数的一个参数是指向套接口地址结构的指针,另一个参数是结构的整数大小,例如:

/* example */



struct sockaddr_in serv;



/* fill in serv{} */

connect(sockfd, (struct sockaddr *)&serv, sizeof(serv));

由于指针和指针所指结构的大小都传递给内核,所以从进程到内核要确切拷贝多少数据是知道的,如下图所示:

image

2、从内核到进程

从内核到进程传递套接口地址结构的有4个函数:accept、recvfrom、getsockname和getpeername。这4个函数的两个参数是:指向套接口地址结构的指针和指向表示结构大小的整数的指针,例如:

/* example */



struct sockaddr_un     cli;    /* Unix domain */

socketlen_t            len;



len = sizeof(cli);             /* len is a value */

getpeername(unixfd, (struct sockaddr *)&cli, &len);

/* len may have changed */

为何将结构大小由整数改为指向整数的指针呢?

这是因为:当函数被调用时,结构大小是一个值(value,此值告诉内核该结构的大小,使内核在写此结构时不至于越界),当函数返回时,此结构又是一个结果(result,它告诉进程内核在此结构中确切存储了多少信息),这种参数类型叫做值-结果(value-result)参数,如下图所示:

image

你可能感兴趣的:(result)