关于accept和getpeername的address_len参数的问题
来源:互联网 发布:龙岗区数据统筹办公室 编辑:程序博客网 时间:2024/06/06 11:46
socket编程中,难免会有需要取得对端信息的时候
socket本身给我们提供了两个方法,accept()和getpeername()
accept()
int accept(int socket, struct sockaddr *restrict address, socklen_t *restrict address_len);
socket:这里的socket是经过bind绑定地址过的socket,可以理解为服务器端的socket。之前有一个监听(listen)操作,accept算是它的后续操作,它们的操作对象都是同一个socket。
restrict address:这里的地址变量,用于保存对端的地址信息。
address_len:参数二restrict address的长度,在写入restrict address信息时,也会将写入信息的长度保存到此变量。注意:manpage里对这个参数有一个说明,在使用前必须要初始化,后面继续说明。
返回值:成功会返回对端的socket fd(非负),失败的话会返回-1.(此时获取errno,errmsg是一个好习惯)
getpeername()
int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
socket:这里的socket和accept中对应的socket有所不同,它应该是对端的socket。
restrict address:同上
address_len:同上
这里面关于address_len还涉及到一个问题,我就犯过这个错误:使用前,没有初始化。
仔细看看manpage,关于这个参数的,事实是这样的:
以accept为例,当accept收到了client的连接,会做两件事:
1,以address_len的值来写对端信息到restrict address,比如,address_len为1,那么对端的信息,只写1个字节到restrict address(或者因为信息长度为XX,大于1而根本就不写进去,这个可能性更大,有待考证)
2,实际上收到的对端的信息长度写到address_len
所以当你的address_len这个变量没有初始化的时候,其默认值为1(Fedora-16),无法把信息完整写入restrict address,造成没有获取到对端信息的假象。
<script type="text/javascript"><!--google_ad_client = "ca-pub-1944176156128447";/* cnblogs 首页横幅 */google_ad_slot = "5419468456";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
- 关于accept和getpeername的address_len参数的问题
- connect 、bind 、accept 函数的参数问题
- getsockname和getpeername的用法及实例
- 关于socket 的accept()
- server端和clien端关于getsockname和getpeername函数的用法
- springMVC produces和ajax accept参数的配合使用
- 关于ACE_Asynch_Acceptor::accept 内存泄露的问题(Windows)
- 在socket编程中,如何获取连接另一端(客户端)的ip地址,使用accept或者getpeername
- accept()函数的奇怪问题
- Socket层实现系列 — getsockname()和getpeername()的实现
- getsockname与getpeername的使用
- 关于linux socket通讯的accept函数的第三个参数剖析
- QDialog accept()函数 和 QCloseEvent的accept()
- 关于accept函数需要注意的一点
- 关于accept得到的socket本地端口
- Accept-Encoding 引起乱码的问题
- accept函数不阻塞的问题
- 关于main参数的问题
- HDU 2141——Can you find it?
- 02_简单web的发布和web项目的目录结构
- 利用数据集在水晶报表中显示图像的 .NET 程序教程
- 实用windows远程桌面登陆ubuntu
- OpenCV机器学习概观、资源、实现
- 关于accept和getpeername的address_len参数的问题
- 转载:《myeclipse6.5安装m2eclipse方法》
- 关于迁移 rac中ocr votedisk
- OpenCV机器学习(1):贝叶斯分类器实现代码分析
- linux下apache+php安装常见问题
- 【框架-MFC】CTreeCtrl(chenlu-3):双击事件和选择事件
- 查看current redo logfile使用率
- 挑战IT达人知识竞赛成功举办
- 项目管理--管理