我正在编写一个包含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()的效率,并且想知道我每次发送都能负担得起.
请参阅getsockname(2).然后,检查该系列的struct sockaddr.
编辑:作为旁注,它有时也有用于查询信息,在这种情况下,信息libc套接字
编辑:
如果不每次都查找它,你真的无法知道.它不能简单地缓存,因为可以通过关闭和重新打开套接字号来重用它.我只是查看了glibc代码,似乎getsockname只是一个系统调用,这可能是令人讨厌的性能.
但我的建议是使用某种面向对象的概念.让用户传递指向您之前返回给他的结构的指针,即让他使用您的API注册/打开套接字.然后你可以缓存你想要的那个套接字.