我遇到了 Windows 8 和 VS2012 特有的问题。
我有一个 TCP 套接字服务器和客户端,正在本地网络上进行一些测试。使用 sysinternals TCPView,我可以看到数据包从 TCP 客户端发送并到达 TCP 服务器(我看到数据包计数器增加)。
但是,数据似乎没有进入应用程序堆栈?
相同的版本在 Windows 7 上运行没有问题。
我关闭了 Windows 8 防火墙,并在关闭 UAC 的情况下对域管理员用户以提升的权限运行这两个进程。
当我将客户端连接到外部服务器(在单独的计算机上运行)时,一切正常。
Windows 8 中是否还有其他内容可以禁止本地进程之间的 TCP 数据通信?
Thanks,
EDIT
为了确保我的服务器应用程序中没有任何内容导致此问题,我在控制台应用程序中构建了一个快速 TCP 服务器,并使用以下套接字构造函数代码:
listenerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
并侦听与我的服务器应用程序相同的本地 IP/端口。
我遇到了同样的问题,我可以远程登录到端口,但listenerSocket.AcceptAsync 永远不会被命中。
EDIT 2
经过进一步测试,我发现我的问题与异步套接字调用的使用有关,即如果我使用像 socket.Accept() 这样的同步调用,测试应用程序将正常执行。但是,当我使用异步套接字调用(即 socket.AcceptAsync())时,我遇到了上述问题。到目前为止,我找不到任何提及 win7 和 8 在异步套接字调用方面的差异。
这是我的快速示例应用程序,它显示异步回调永远不会被触发。此代码片段在 Windows 7 中工作正常,但在 Windows 8 中不起作用(尝试远程登录到 127.0.0.1 : 7000)。
class Program
{
private static SocketAsyncEventArgs socketAsyncEventArgs = new SocketAsyncEventArgs();
static void Main(string[] args)
{
var listenerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
listenerSocket.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 7000));
listenerSocket.Listen(100);
socketAsyncEventArgs.Completed += AcceptEventArg_Completed;
listenerSocket.AcceptAsync(socketAsyncEventArgs);
Console.ReadLine();
}
private static void AcceptEventArg_Completed(object sender, SocketAsyncEventArgs e)
{
Console.WriteLine("AcceptEventArg_Completed");
}
}
EDIT 3
我发现另外 2 个人在 Microsoft Connect 上报告了同样的问题:https://connect.microsoft.com/VisualStudio/feedback/details/759913/socketasynceventargs-completed-doesnt-fire-in-net-framework-4-5 https://connect.microsoft.com/VisualStudio/feedback/details/759913/socketasynceventargs-completed-doesnt-fire-in-net-framework-4-5
and
http://connect.microsoft.com/VisualStudio/feedback/details/747218/saea-not-working-in-net-4-5-rp http://connect.microsoft.com/VisualStudio/feedback/details/747218/saea-not-working-in-net-4-5-rp
而第二个很有趣,因为它似乎得出结论,Console.ReadLine() 调用中存在 Windows 错误,它导致了问题并阻止了异步回调。如果我将代码片段中的 Console.ReadLine() 替换为:
while (true)
{
System.Threading.Thread.Sleep(10);
}
一切正常。