Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C (如何)从套接字文件描述符确定套接字系列_C_Sockets_Ipc - Fatal编程技术网

C (如何)从套接字文件描述符确定套接字系列

C (如何)从套接字文件描述符确定套接字系列,c,sockets,ipc,C,Sockets,Ipc,我正在编写一个API,其中包括IPC函数,这些函数将数据发送到另一个进程,该进程可以是本地进程,也可以是另一台主机上的进程。我真的希望发送功能简单到: int mySendFunc(myDataThing_t* thing, int sd); 在mySendFunc()调用的直接上下文中,调用方不必知道sd是导致本地进程还是远程进程。在我看来,如果我可以这样做: switch (socketFamily(sd)) { case AF_UNIX: case AF_LOCAL: // Sen

我正在编写一个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()实现为:

但我有点担心getsockname()的效率,不知道我是否能负担得起每次发送时的费用。

请参阅。然后检查该族的结构sockaddr

编辑:作为旁注,有时查询信息也很有用,在本例中是info libc套接字

编辑:

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


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

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

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


这样,当两台机器具有相同的端号时,您就不必进行字节交换。

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

除非我误解了您的意思,否则这只适用于接收,而不适用于发送。使用这种技术,字节交换只在接收端进行。发送方从不交换数据——它只是在其余数据之前设置该4字节的值。通过查看接收端上的4个字节,接收方知道它们是否需要交换。其美妙之处在于,只要发送方和接收方的端度匹配,就不会进行字节交换,即使它们不是按网络字节顺序排列的。是的,尽管如果有人决定单方使用它,这是行不通的,例如,制作HTTP检索器。对,这里的警告是,您需要控制连接的双方。或者至少能够向对方口述条款:)。我不清楚原始海报的情况。因为我经常做本地IPC,不想对每个多字节值都做hton*()然后ntoh*()。为什么不呢?在网络案例中,您仍然需要此代码。有没有证据表明字节交换是IPC环境中的瓶颈?@fizzer,告诉Xorg的人。是的,这很重要。当你在进行网络通信时,如果你想让你的应用程序具有良好的可扩展性,你就要尽可能地减少数据复制。尽管这有一点。如果我们假设端点之间没有协作,我不确定该怎么办:本地套接字通常希望数据按网络字节顺序排列吗?我注意到了你上次的顾虑,我编辑了我的帖子。我很困惑,但后来我意识到,可以传入的每一个不同的结构中,第一个元素都是该族的无符号短字符。my_sockaddr.sa_family==AF_UNIX
unsigned short socketFamily(int sd)
{
   struct sockaddr sa;
   size_t len;
   getsockname(sd, &sa, &len);   
   return sa.sa_family;
}