WCF是基于套接字构建的
Is WCF built on sockets?
我正在尝试更详细地理解使用套接字编程,而不仅仅是使用API调用。我对C++中使用WinSocks进行C#WCF和套接字编程有相当的了解。现在我有两个主要问题:
- WCF是否在所有情况下都在内部使用套接字进行通信。换句话说,WCF是围绕套接字的包装器吗
- 是否所有基于网络的通信都在末端使用套接字来发送/接收数据,这是OSI模型强制要求的
一点详细的解释会比只回答"是/否"更好。
(确认同意重新打开此问题的其他SO用户)。
作为开场白,请记住,现在是
现在,在回答你的问题(我的重点是粗体):
WCF是否在所有情况下都在内部使用套接字进行通信。换句话说,WCF是围绕套接字的包装器吗?
严格来说,否(但在实际意义上,对于机器间传输,是)。
WCF是一个.NET平台;消息处理";。WCF试图抽象出消息传输的底层细节(但它做得太可怕了,所以今天没有人应该使用它),因此完全有可能构建一个WCF应用程序,在不使用Windows的Winsock或任何";插座"-式API可用于给定的计算平台。
现在,虽然表面上WCF都是抽象的,但实际上WCF是围绕SOAP消息的(SOAP也很可怕,但这是另一个讨论),SOAP主要使用HTTP作为消息传输,HTTP主要使用TCP/IP,Microsoft Windows上的几乎每一个TCP/IP应用程序都将在进程通信堆栈中的某个位置使用Winsock API。(可以说,Windows上的HTTP应用程序将使用在内核模式中执行HTTP请求/响应处理的http.sys
,这必然意味着绕过Windows的用户模式Winsock API,而http.sys
使用"Winsock内核",这是它自己的东西)。
在上面的段落中,注意单词";主要是";(与"独占"或"始终"相反)-因为:
- WCF不必使用SOAP,它可以使用其他消息传递模型/协议/范式,如
net.tcp
(它本身更像是"二进制SOAP"),甚至REST(尽管REST支持在WCF的使用寿命后期才出现,正确配置是一件非常困难的事,YMMV) - SOAP不必使用HTTP,它可以使用其他传输,如SMTP。WCF明确支持其他SOAP的其他主要传输,如SMTP和FTP
- 虽然HTTP有效地与TCP/IP绑定,并且Winsock是用户模式应用程序使用TCP/IP的唯一真实方式,但其他传输(如SMTP)不必使用TCP/IP(至少,不是你认为的方式-请参阅我的脚注)
- 当然,在所有这一切中,除了Winsock或BSD套接字之外,用户模式应用程序总是可以自由使用不同的网络编程接口(例如,Windows的命名管道提供了流式IPC接口,就像TCP的行为一样),或者网络接口卡的供应商可以拥有自己的专门网络API,这在某种程度上比套接字API更好(类似于20世纪90年代中期GPU供应商推出自己的API(Glide、PowerVR、Rendition等),直到他们都不得不支持Direct3D和OpenGL(谁使用Metal?哈哈)
- 虽然WCF在设计时并没有完全考虑到可测试性,但仍然可以在集成测试环境中托管和运行WCF应用程序,在该环境中,实际的消息传输只是一个精简的代理对象,或者是一个伪造或模拟的实现,因此在那里也完全避免了套接字
但在实践中-在Win32中,网络是使用Winsock(Microsoft的BSD Sockets API实现)实现的,因此如果您使用WCF在机器之间进行通信,那么我可以99%肯定地说,最终您的消息将通过Winsock。
脚注:关于在不使用套接字的情况下将WCF与SMTP一起使用:许多SMTP电子邮件服务器,包括Microsoft Exchange Server,都支持";拾取目录"-这些文件系统目录是由电子邮件服务器主动监控的文件系统目录,它检测新文件何时被添加到文件夹中,并将每个文件读取为SMTP信封,并以与服务器的SMTP服务端点接收的SMTP信封相同的方式处理它——如果在SMTP中的SOAP消息是"SOAP";丢弃";在pickup目录中,并且它的目的地是pickup文件夹的电子邮件服务的本地收件人,那么该消息也根本不会通过Winsock。
- 当套接字连接断开时检测C/C++Unix
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- 套接字读取后,我在缓冲区中看到意外输入
- 如何在CPP中创建应该在Windows和Linux上运行的套接字?
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 套接字连接"Operation not permitted"错误,甚至使用升压/平发器根.cpp
- WINAPI 注册应用程序重新启动时不清除打开的套接字
- (Winsock) UDP 接收工作正常,但同一套接字的发送失败
- MSG_WAITALL的套接字发送得到了 22 EINVAL
- C++套接字客户端到 Python 服务器未创建连接
- 在不知道套接字的情况下关闭网络连接
- WCF是基于套接字构建的
- Windows 套接字和身份验证构建在包含 Poco-Library 时失败
- 如何获取其他人可以使用的IP来连接到我的c 中的套接字构建
- 套接字消息头构建
- 如何使用套接字构建健壮的网络体系结构
- 如何在VS2010中构建Interactive Brokers API c++测试套接字客户端?
- 接收方拒绝仅为- 0构建打开套接字