从进程到内核
从进程到内核传递套接字地址结构的函数有3个:bind,connect和sendto。这些函数的一个参数是指向某个套接字地址结构的指针,另一个参数是该结构的整数大小。
既然指针和指针所指内容的大小都传递给了内核,于是内核知道到底需要从进程复制多少数据进来。
从内核到进程
从内核到进程传递套接字结构的函数有4个:accept,recvfrom,getsockname和getpeername。这些函数其中的两个参数一个是指向表示指向某个套接字地址结构的指针和指向表示该结构大小的整数变量的指针。
accept、getsockname、getpeername,函数被调用时结构大小是一个值,它告诉内核该结构的大小避免内核写操作越界,函数返回时,结构大小又是一个结果,它告诉进程内核写进数据的多少,这种参数叫做值-结果参数。例如:
struct sockaddr_in addr;
//..........
socklen_t len = sizeof(addr);
getpeername( sockfd, (struct sockaddr*)&addr, &len );
网络编程中,值-结果参数最常见的例子是所返回套接字地址结构的长度。其他的一些值-结果参数有:
* select函数中间的3个参数;
* getsockopt函数的长度参数
* 是用recvmsg函数时,msghdr结构中的msg_namelen和msg_controllen字段。
* ifconf结构中的ifc_len字段。
* sysctl函数两个长度参数中的第一个。