【问题标题】:Win32 Sockets vs. Named PipesWin32 套接字与命名管道
【发布时间】:2009-09-28 01:02:31
【问题描述】:

是否可以在 Win32 上使用套接字并且 防火墙可能会阻止您正在使用的端口?

在 Unix 中,您可以使用 IF_UNIX 代替 IF_INET(即 命名管道 代替 套接字)。现在在 Windows 中你可以open a socket using different protocols:

socket(AF_INET,    SOCK_RAW, IPPROTO_TCP);     //open an IPv4 socket
socket(AF_BTH,     SOCK_RAW, BTHPROTO_RFCOMM); //open a Bluetooth socket
socket(AF_NETBIOS, SOCK_RAW, IPPROTO_TCP);     //open an IPX/SPX socket
socket(AF_INET6,   SOCK_RAW, IPPROTO_TCP);     //open an IPv6 socket

有没有办法打开命名管道套接字?例如。 (假设结构)

socket(AF_NAMEDPIPE, SOCK_RAW, IPPROTO_TCP);   //open a named pipe socket

【问题讨论】:

  • 在没有进入圣战的情况下,是什么驱使您得出结论,win32 上的命名管道如此不可靠?我一直在 Windows 上使用 WCF NetNamedPipeBinding,一点问题都没有。
  • @Matt 您是否一直在收集全球客户分布的统计数据?我已经看到失败率接近 1% 失败,但仅来自统计数据,在超过 10 台测试机器中无法重现......试图形成一个想法,如果系统中的代码质量很差,或者这些事情真的不可靠(我只是开了一个通过消除不必要的管道使用,将特定操作中的错误率降低 10 倍以上)。
  • @eglasius,没有。我不使用管道通过网络进行通信。我对 NetNamedPipeBinding 的使用与本地框隔离,并且工作可靠。我仍然使用传统的套接字来跨越机器边界。
  • 抱歉,我措辞不好,我的意思是在许多 PC 上部署,而管道仅在这些 PC 中本地使用。所以同样的场景,本地使用/但不是受控环境,那里的用户拥有。

标签: sockets winapi named-pipes


【解决方案1】:

正如 John Cavan(我想我曾经和他一起上学)所说,使用环回地址应该完全避免 NIC 和防火墙,并且还可以让您更改为完整的客户端-服务器模型(即单独的机器) , 可能在不同的平台上) 稍后只需最少的代码更改。

我还成功地将共享内存用于同机通信。这通常比 TCP/IP 和命名管道更快。但是,我发现 Win32 上的命名管道可靠且相对较快。

【讨论】:

  • 我对命名管道可靠性评论很感兴趣,你能分享更多吗? / 请参阅我刚刚在问题中发布的评论。
  • TCP/IP 和命名管道的另一个优点是同步访问共享内存,并指示数据准备就绪。
【解决方案2】:

我还没有尝试过,但我建议如果你绑定到环回地址,那么你应该清除防火墙。如果您正在寻找命名管道的替代方案,您可能还是希望这样做,因为它应该比通过 NIC 实际通信更快。

您是否考虑过其他替代方案,例如共享内存?尽管如此,切换到套接字的好处是您可以稍后将两个进程放在不同的机器上,并且仍然可以在不更改代码的情况下进行通信(假设您避免了对 IP 地址进行硬编码的错误)。

【讨论】:

    【解决方案3】:

    有一个地址,类似于我用 Java 提出的 192168 dot var,在私有使用范围内使用随机选择的端口,赢了让它运行,没有任何抱怨。

    【讨论】:

      猜你喜欢
      • 2010-11-17
      • 2010-12-17
      • 2012-03-17
      • 1970-01-01
      • 2021-09-21
      • 2012-06-08
      • 1970-01-01
      • 2010-12-25
      • 2011-02-08
      相关资源
      最近更新 更多