UNIX网络编程学习(4)--值-结果参数
2012-03-21 20:26
513 查看
我们已经知道,当把套接口地址结构传递给套接口函数时,总是通过指针来传递的,即传递的是一个指向结构的指针。结构的长度也作为参数来传递,其传递方式取决于结构的传递方向:从进程到内核,还是从内核到进程。
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)。
当使用值-结果参数作为套接口地址结构的长度时,如果套接口地址结构是定长的,则从内核返回的值也是定长的,如对于IPv4,sockaddr_in是16;对于IPv6,sockaddr_in6是28。但对于变长的套接口地址结构(如Unix域的sockaddr_un),返回值可能比结构的最大长度小。
原帖地址:http://www.cnblogs.com/ChangeIt/archive/2011/12/26/2302294.html
相关文章推荐
- UNIX网络编程学习笔记:值-结果(value-result)参数
- ibatis源码学习3_参数和结果的映射原理
- UNIX网络编程第3章套接字编程简介3.2套接字地址结构3.3值结果参数3.4字节排序函数
- 【web开发学习笔记】Structs2 Result学习笔记(三)带参数的结果集
- Struts2学习——1200带参数的结果集
- ibatis源码学习(三)参数和结果的映射原理
- dubbo学习五--服务分组,多版本,参数验证,结果缓存
- UNIX网络编程(3.6)TCP、通配、套接字地址结构、值-结果参数
- 【JavaWeb Structs2学习】 addFieldError以及ValueStack (应用:接受参数进行判断返回结果输出至页面)
- 最大似然估计学习总结------MadTurtle 1. 作用 在已知试验结果(即是样本)的情况下,用来估计满足这些样本分布的参数,把可能性最大的那个参数clip_image002作为真实cl
- JAVAEE学习——struts2_02:结果跳转方式、访问servletAPI方式、获得参数以及封装、练习:添加客户
- 细雨学习笔记:Jmeter上一个请求的结果作为下一个请求的参数--使用正则提取器
- ibatis源码学习(三)参数和结果的映射原理
- Deep Learning(深度学习)学习笔记整理系列之LeNet-5卷积参数个人理解
- node.js学习笔记2——querystring (查询字符串,参数处理)
- 深度学习参数和架构设计技巧
- Python学习笔记5:函数参数详解
- 黑马程序员--Java基础学习笔记【参数传递、访问控制符、内部类】
- 【OpenCV学习笔记】【函数学习】十六(Rect参数介绍)
- Dynamic CRM 2013学习笔记(一)插件输入实体参数解析