c - (如何)我可以从套接字文件描述符确定套接字族吗

标签 c sockets ipc

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

最佳答案

参见 getsockname(2) .然后检查该系列的struct sockaddr

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

编辑:

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

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

关于c - (如何)我可以从套接字文件描述符确定套接字族吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/513298/

相关文章:

Javafx 服务器套接字 - 发送字符串消息

c++ - 接收(recv)完整请求(例如curl HTTP)

linux - 阻塞信号

c - 现场程序错误但不在代码块上

sockets - 关闭套接字以避免 "connection reset by peer"的正确方法

C# IpcChannel 远程连接失败(实际远程处理时)

ipc - Xojo IPCSocket连接多次

c - Apache 日志 RSA 加密

c - 为什么野指针是用共享库虚拟地址初始化的?

c - 在 Linux 中使用 DMA 的最简单方法