当name = null时,getsockname行为

当name = null时,getsockname行为,第1张

概述当name = null时,getsockname行为

我有窗口中的代码调用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行为所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1277928.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存