Win32套接字 vs. 命名管道

4

在Win32上使用socket,是否可能不会被防火墙阻止你使用的端口?

在Unix上,可以使用IF_UNIX而不是IF_INET(即使用命名管道而不是套接字)。目前在Windows上,您可以使用不同的协议打开套接字

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

2
不谈论什么是对错,你是基于什么来得出win32命名管道非常不可靠的结论的?我一直在Windows上使用WCF NetNamedPipeBinding而没有遇到任何问题。 - Matt Davis
@Matt,你是否一直在全球客户端范围内捕获统计数据?我看到了接近1%的故障率,但只是从统计数据中看到的,而不是在超过10台测试机器上重现...试图形成一个想法,是系统中代码质量差还是这些东西真的不可靠(我刚刚通过去掉不必要的管道使用,在特定操作中将错误率降低了10倍以上)。 - eglasius
@eglasius,不,我不使用管道进行跨网络通信。我的NetNamedPipeBinding的使用仅限于本地计算机,并且它可以可靠地工作。我仍然使用传统套接字来跨越机器边界。 - Matt Davis
抱歉,我的措辞不太好,我的意思是在许多PC上部署,在这些PC上管道仅用于本地使用。因此,相同的情况,本地使用/但用户所拥有的不是受控环境。 - eglasius
3个回答

5

正如John Cavan所说,使用回环地址可以完全避免使用NIC和防火墙,并且还可以使您能够在以后进行最少代码更改的情况下切换到完整的客户端-服务器模型(即分别位于不同平台上的不同机器)。

我还成功地使用共享内存进行了同一台计算机之间的通信。这通常比TCP/IP和命名管道更快。但是,我发现Win32上的命名管道是可靠且相对快速的。


我对命名管道的可靠性评论很感兴趣,你能分享更多吗? / 请看我刚刚在问题中发布的评论。 - eglasius
TCP/IP和命名管道的另一个优点是同步访问共享内存,并指示数据已准备就绪。 - Ian Boyd

3

我没有尝试过这个方法,但是如果你绑定到环回地址,那么你应该可以避免防火墙的限制。如果你正在寻找一种替代命名管道的方式,那么你可能希望这样做,因为它比通过网络接口卡通信更快。

你有考虑过其他替代方案,比如共享内存吗?然而,使用套接字的好处是,以后你可以将这两个进程放在不同的机器上,仍然可以进行通信,而不需要更改代码(假设你避免了硬编码IP地址的错误)。


-1

有一个地址,类似于192.168.xxx.xxx,我用Java提出了这个地址,并在私人使用范围内随机选择了一个端口,Win让它无任何投诉地运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接