我有窗口中的代码调用getsockname如下:
getsockname(*x,NulL,0)
第三个参数(namelen)是IN Out参数,包含名称缓冲区的大小,以字节为单位。 返回时,namelen参数包含name参数的实际大小(以字节为单位)。
现在,我的问题是如果名称等于null,并且namelen等于零,会出现什么情况?我在linux中看到了,如果name是NulL,namelen被忽略,但是MSDN没有提到这种情况。 这里的MSDN链接是linux的IBM链接
提前致谢
链接没有C运行时与VS2010未解决的符号
extern char ** environ的定义在哪里?
二维(或三维)graphics编程使用windows API与C + +?
确定可读文件描述符是否是pipe道的读取结束
从任务pipe理器启动进程并隐藏命令行参数
在控制台应用程序中回应问题(linux)
观看由exe dll使用的资源
TUN / TAP上的C编译器错误
windows 8.1在windowsBase和PresentationCore中复制资源
libc(glibc)在我们的linux应用程序中的作用是什么?
在你的代码中,你为第三个参数传递了零。
第三个参数不能为空,根据规范,它必须是一个指向给定第二个参数长度的整数的指针,并且在输出上给出地址的实际大小。 通过零并不意味着你说没有存储分配,这意味着你说你没有通过信息,也没有任何地方写输出值。
根据MSDN和linux文档,该函数应该返回-1并将errno为EFAulT (或者在windows套接字WSAEFAulT WSAGetLastError设置为WSAEFAulT )。 这被定义为“根据指定使用name和namelen参数将导致尝试访问主叫方地址空间之外的存储”。
但是,这不是Posix规范的一部分,我不认为这是要求函数检查地址 – 只是它可以。 换句话说,至少在Posix中,这是未定义的行为。 这意味着什么都可能发生。
在linux中,你说你已经观察到,如果传递null,这两个参数将被忽略。 我怀疑你的代码没有检查返回值,当errno设置为EFAulT ,这个值可能是-1。
Posix函数不会抛出异常。 你应该检查返回码,可能是这样的:
int result = getsockname(*x,0); if(result){ /*Failed - handle here*/ }
总结以上是内存溢出为你收集整理的当name = null时,getsockname行为全部内容,希望文章能够帮你解决当name = null时,getsockname行为所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)