我正在编写一个 API,其中包含 IPC 函数,这些函数将数据发送到另一个进程,该进程可能是本地的或在另一台主机上。我真的希望发送函数像这样简单:
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() 的效率,想知道每次发送时我是否负担得起。
最佳答案
参见 getsockname(2) .然后检查该系列的struct sockaddr。
编辑:作为旁注,有时查询 info 也很有用,在这种情况下 info libc sockets
编辑:
如果不每次都查一下,你真的不知道。它不能简单地缓存,因为套接字号可以通过关闭和重新打开它来重复使用。我刚刚查看了 glibc 代码,似乎 getsockname 只是一个系统调用,这在性能方面可能很糟糕。
但我的建议是使用某种面向对象的概念。让用户传递一个指向您之前返回给他的结构的指针,即让他使用您的 API 注册/打开套接字。然后你可以缓存你想要的关于那个套接字的任何东西。
关于c - (如何)我可以从套接字文件描述符确定套接字族吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/513298/