当前位置:  开发笔记 > 编程语言 > 正文

(如何)我可以从套接字文件描述符中确定套接字系列

如何解决《(如何)我可以从套接字文件描述符中确定套接字系列》经验,为你挑选了1个好方法。

我正在编写一个包含IPC函数的API,这些函数将数据发送到另一个可能是本地或另一个主机的进程.我真的很喜欢发送功能如下:

int mySendFunc(myDataThing_t* thing, int sd);

没有调用者必须知道 - 在mySendFunc()调用的直接上下文中 - sd是否导致本地或远程进程.在我看来,如果我能这样:

switch (socketFamily(sd)) {
case AF_UNIX:
case AF_LOCAL:
   // Send without byteswapping
   break;
default:
   // Use htons() and htonl() on multi-byte values
   break;
}

有人建议我可以实现socketFamily():

unsigned short socketFamily(int sd)
{
   struct sockaddr sa;
   size_t len;
   getsockname(sd, &sa, &len);   
   return sa.sa_family;
}

但是我有点担心getsockname()的效率,并且想知道我每次发送都能负担得起.



1> Eduard - Gab..:

请参阅getsockname(2).然后,检查该系列的struct sockaddr.

编辑:作为旁注,它有时也有用于查询信息,在这种情况下,信息libc套接字

编辑:

如果不每次都查找它,你真的无法知道.它不能简单地缓存,因为可以通过关闭和重新打开套接字号来重用它.我只是查看了glibc代码,似乎getsockname只是一个系统调用,这可能是令人讨厌的性能.

但我的建议是使用某种面向对象的概念.让用户传递指向您之前返回给他的结构的指针,即让他使用您的API注册/打开套接字.然后你可以缓存你想要的那个套接字.

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有