我遇到了Windows8和VS2012特有的问题。
我有一个TCP套接字服务器和客户端,并且正在本地网络上进行一些测试。使用sysinternals,我可以看到数据包从TCP客户端发送并到达TCP服务器(我看到数据包计数器增加)。
但是,看起来数据似乎没有进入应用程序堆栈?完全相同的版本在Windows7上运行时没有问题。
我关闭了Windows 8防火墙,并在域管理员用户上以提升的权限运行这两个进程,同时关闭了UAC。
当我将客户端连接到外部服务器(在单独的机器上运行)时,一切工作正常。在Windows8中是否还有其他东西可以禁止本地进程之间的TCP数据通信?
谢谢,
编辑
为了确保服务器应用程序中没有任何东西会导致此问题,我在控制台应用程序中构建了一个快速TCP服务器,其中套接字构造函数的代码如下:
listenerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);并在与我的服务器应用程序相同的本地IP/端口上侦听。我遇到了同样的问题,我可以远程登录到端口,但listenerSocket.AcceptAsync从未命中。
编辑2个
在进一步的测试中,我的问题与异步套接字调用的使用有关,也就是说,如果我使用像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个
我发现还有另外两个人在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 bug,它导致了这个问题并阻塞了异步回调。如果我将代码片段中的Console.ReadLine()替换为:
            while (true)
        {
            System.Threading.Thread.Sleep(10);
        }一切都很好。
https://stackoverflow.com/questions/12464185
复制相似问题