Windows 8 – .NET TCP AcceptAsync回调未触发(由Console.ReadLine()阻止)
我遇到了Windows 8和VS2012特有的问题。
我有一个TCP套接字服务器和客户端,我正在本地网络上进行一些测试。 使用sysinternals TCPView,我可以看到数据包是从TCP客户端发送到达TCP服务器的(我看到数据包计数器增加)。
但是,好像数据没有进入应用程序堆栈? 在Windows 7上,完全相同的构建运行没有问题。
我关闭了Windows 8防火墙,并在关闭UAC的域管理员用户上使用提升的权限运行这两个进程。
当我将客户端连接到外部服务器(在单独的机器上运行)时,一切正常。 Windows 8中是否还有其他可以禁止本地进程之间的TCP数据通信的内容?
谢谢,
编辑
为了确保我的服务器应用程序中没有任何内容导致此问题,我在控制台应用程序中构建了一个快速TCP服务器,其中包含以下用于套接字构造函数的代码:
listenerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
并在与我的服务器应用程序相同的本地IP /端口上侦听。 我遇到了同样的问题,我可以telnet到端口但是listenerSocket.AcceptAsync永远不会被击中。
编辑2
在进一步测试时,我认为我的问题与使用Async套接字调用有关,即如果我使用像socket.Accept()这样的同步调用,则测试应用程序正常运行。 但是,当我使用异步套接字调用,即socket.AcceptAsync()时,我遇到了提到的问题。 到目前为止,我找不到关于异步套接字调用的win7和8之间的差异。
这是我的快速示例应用程序,它显示异步回调从未被触发。 此代码段在Windows 7中正常工作,但在Windows 8中不起作用(尝试telnet到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"); } }
编辑3
我发现其他2个人在Microsoft Connect上报告了同样的问题: https : //connect.microsoft.com/VisualStudio/feedback/details/759913/socketasynceventargs-completed-doesnt-fire-in-net-framework-4-5和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); }
一切正常。
请参阅: 如果最初发出IO的线程在Windows 8下的ReadFile中阻塞,则GetQueuedCompletionStatus无法从IOCP中取出IO
这是Windows 8和2012中的一个错误,会影响使用AcceptEx和ReadFile的所有程序。 至于现在,只知道这两个function受到影响。
当我使用SocketAsyncEventArgs开发Tcp服务器和客户端应用程序时,我遇到了同样的事情
我建议你先试试这个。
-
使用高级安全性打开Windows防火墙检查入站/出站规则以查看您的应用程序是否被阻止。
-
打开AssemblyInfo.cs并更改
[议员:Guid(“06985fe3-80eb-48b4-940a-fd926e2f2053”)]
任何其他guid值。
通过更改它,Windows会认为这是一个新的应用程序,如果对旧应用程序有任何限制,它将不会在新的应用程序上。
在Windows 8上听起来像这个与IOCP处理(可能只是AcceptEx)相关的Windows bug,而其他阻塞I / O正在同一个线程上进行:
https://social.technet.microsoft.com/Forums/en-GB/winserver8gen/thread/5764cd0f-fda1-4cfa-ae35-808210bae77e
因此接受套接字连接,但您的应用程序永远不会收到它的通知。
也许Windows 8做了一些奇怪的,轻微破碎的伏都教,将Console.Read等同步IO转换为异步内部。
您可以将您的服务器代码移动到另一个线程,尝试的其他解决方法可能是同步执行Accept或将控制台处理更改为异步(我不能尝试,因为我没有Windows 8)。
上述就是C#学习教程:Windows 8 – .NET TCP AcceptAsync回调未触发(由Console.ReadLine()阻止)分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/955460.html