我正在编写一个包含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()的效率,并且想知道我每次发送都能负担得起。
答案 0 :(得分:6)
见getsockname(2)。然后检查该系列的 struct sockaddr 。
编辑:作为旁注,它有时也可用于查询 info ,在本例中为 info libc套接字
编辑:
每次不抬头,你真的无法知道。它不能简单地缓存,因为可以通过关闭和重新打开套接字号来重用它。我只是查看了glibc代码,似乎 getsockname 只是一个系统调用,这可能是令人讨厌的性能。
但我的建议是使用某种面向对象的概念。让用户传递指向您之前返回给他的结构的指针,即让他使用您的API注册/打开套接字。然后你可以缓存你想要的那个套接字。
答案 1 :(得分:2)
为什么不总是以网络字节顺序发送?
答案 2 :(得分:1)
如果你控制客户端和服务器代码我有一个不同的建议,我过去成功使用过。
让邮件的前四个字节为已知整数值。然后,接收器可以检查前四个字节以查看它是否与已知值匹配。如果匹配,则不需要进行字节交换。
这使您无需在两台计算机具有相同的字节顺序时进行字节交换。