7

我正在编写一个 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() 的效率,想知道我是否能负担得起每次发送。

4

3 回答 3

6

请参阅getsockname(2)。然后,您检查该族的struct sockaddr

编辑:作为旁注,查询信息有时也很有用,在这种情况下是info libc sockets

编辑:

你真的不每次都查一下就知道了。它不能简单地被缓存,因为套接字号可以通过关闭和重新打开来重用。我刚刚查看了 glibc 代码,似乎getsockname只是一个系统调用,这在性能方面可能很糟糕。

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

于 2009-02-04T21:02:07.020 回答
2

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

于 2009-02-04T21:25:38.503 回答
1

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

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

当两台机器具有相同的字节序时,这使您不必进行字节交换。

于 2009-02-04T21:13:33.957 回答