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

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

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

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

编辑:

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

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

为什么不总是发送网络字节顺序?

如果你控制客户端和服务器代码我有一个不同的建议,我过去成功使用过。

让消息的前四个字节为已知整数值。 接收器然后可以检查前四个字节以查看它是否与已知值匹配。 如果匹配,则不需要字节交换。

这使得您无需在两台计算机具有相同的字节顺序时进行字节交换。