首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Windows 8- .NET TCP AcceptAsync回调未触发(被Console.ReadLine()阻止)

Windows 8- .NET TCP AcceptAsync回调未触发(被Console.ReadLine()阻止)
EN

Stack Overflow用户
提问于 2012-09-18 01:19:53
回答 3查看 3.6K关注 0票数 18

我遇到了Windows8和VS2012特有的问题。

我有一个TCP套接字服务器和客户端,并且正在本地网络上进行一些测试。使用sysinternals,我可以看到数据包从TCP客户端发送并到达TCP服务器(我看到数据包计数器增加)。

但是,看起来数据似乎没有进入应用程序堆栈?完全相同的版本在Windows7上运行时没有问题。

我关闭了Windows 8防火墙,并在域管理员用户上以提升的权限运行这两个进程,同时关闭了UAC。

当我将客户端连接到外部服务器(在单独的机器上运行)时,一切工作正常。在Windows8中是否还有其他东西可以禁止本地进程之间的TCP数据通信?

谢谢,

编辑

为了确保服务器应用程序中没有任何东西会导致此问题,我在控制台应用程序中构建了一个快速TCP服务器,其中套接字构造函数的代码如下:

代码语言:javascript
运行
复制
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)。

代码语言:javascript
运行
复制
    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-5http://connect.microsoft.com/VisualStudio/feedback/details/747218/saea-not-working-in-net-4-5-rp

而第二个很有趣,因为它似乎得出结论,在Console.ReadLine()调用中有一个Windows bug,它导致了这个问题并阻塞了异步回调。如果我将代码片段中的Console.ReadLine()替换为:

代码语言:javascript
运行
复制
            while (true)
        {
            System.Threading.Thread.Sleep(10);
        }

一切都很好。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12464185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档