【发布时间】:2016-12-19 17:49:10
【问题描述】:
我有一个 Silverlight 5 应用程序尝试建立与服务器的套接字连接,如下所示:
var targetEndpoint = new DnsEndPoint("subdomain.maindomain.com", 443);
var clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
var socketAsyncEventArgs = new SocketAsyncEventArgs {RemoteEndPoint = targetEndpoint};
socketAsyncEventArgs.Completed += AsyncConnectCallback;
clientSocket.ConnectAsync(socketAsyncEventArgs);
我在 https://subdomain.maindomain.com/clientaccesspolicy.xml 有以下 clientaccesspolicy.xml 文件:
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="*" http-methods="*">
<domain uri="https://subdomain.maindomain.com"/>
<domain uri="*"/>
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true"/>
<socket-resource port="4502" protocol="tcp"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
我能够从 Visual Studio 运行 Silverlight 应用程序的本地实例,并且可以建立套接字连接,既可以在浏览器内运行,也可以在浏览器外运行。当我部署应用程序时,我仍然可以使用浏览器外版本进行连接,但浏览器内版本会出错并显示以下消息:
AccessDenied: An attempt was made to access a socket in a way forbidden by its access permissions.
在我从 Visual Studio 运行的本地环境中,如果我创建主机文件条目:
127.0.0.1 myapp.local
并更新我的localhost浏览器内实例(从VS运行)以使用myapp.local,我可以重现相同的错误,这表明当根域不是localhost时发生错误,无论在哪里应用程序已托管。
我已检查我的防火墙和防病毒软件的事件日志,看是否有迹象表明它们可能会阻止连接请求,但没有看到任何证据。
有其他人遇到过这个问题并就我的问题提出建议吗?
【问题讨论】:
-
code和xml中的端口号有冲突。保留端口 443(请参阅en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers)。 1000 以下的端口号是保留的,并且经常被防火墙和/或病毒检查程序阻止。 127.0.0.1 的错误可能与端口号不同。 127.0.0.1 是环回 IP 地址,只能在 Net 库中用于监听(在服务器端)。如果在 Connect() 方法中使用 Net Library 会报错。
-
端口号不同并不冲突——xml中的端口号用于其他目的。我知道 443 是为 TLS/SSL 保留的,但这正是建立套接字连接的原因,以便能够转发 TLS 请求。
-
几年前我做了一些 SSL 集成,但不记得所有细节了。您可能需要参考 Wiki 文章:en.wikipedia.org/wiki/Transport_Layer_Security。我会使用像 Wirsshark 或 Fiddler 这样的嗅探器来准确找出您在协议中失败的位置。来自网络库的错误消息有时会产生误导。您还没有指定您使用的 TLS 版本。确保它是正确的版本。
-
我正在使用第 3 方库(eldos 安全黑盒)来处理 TLS 详细信息。我确实使用 wireshark 来监控我的 TLS 流量,但在这种情况下,代码不足以开始发送 TLS 请求。我试图打开的套接字是用于发送 TLS 请求数据包的通道,但由于无法打开套接字,所以我没有足够远来发送数据包。在这种情况下,TLS 实现是无关紧要的,因为建立正常的套接字连接是失败的。
-
如果没有发送消息,那么您可能正在使用 127.0.0.1 和 Connect() 方法。 Connect 方法必须使用服务器的 IP 地址(或名称)。 127.0.0.1 仅用于服务器监听。 Net 库不会从以 127.0.0.1 作为目标 IP 地址的客户端发送任何消息。
标签: c# sockets silverlight-5.0