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

时间:2009-02-04 20:55:31

标签: c sockets ipc

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

3 个答案:

答案 0 :(得分:6)

getsockname(2)。然后检查该系列的 struct sockaddr

编辑:作为旁注,它有时也可用于查询 info ,在本例中为 info libc套接字

编辑:

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

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

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