【问题标题】:TcpListener doesn't connect/establish a connectionTcpListener 不连接/建立连接
【发布时间】:2014-08-18 18:00:36
【问题描述】:

我正在尝试在没有 ManualResetEvent 的情况下启动连接,它只是跳过 BeginAcceptSocket 告诉我按任意键继续,尽管使用 ManualResetEvent 我成功获得了连接,但客户端向我发送了不相关的字节。

    static void Main(string[] args)
    {
        tcpListener = new TcpListener(IPAddress.Any, 8484);
        tcpListener.Start();
        tcpListener.BeginAcceptSocket(AcceptSocket, tcpListener);
    }
    private static void AcceptSocket(IAsyncResult async)
    {
        new Client(tcpListener.EndAcceptSocket(async));
        tcpListener.BeginAcceptSocket(AcceptSocket, null);
    }

例如,将 Client 视为传入字节的 Acceptor。

【问题讨论】:

    标签: c# sockets connection byte tcplistener


    【解决方案1】:

    BeginAcceptSocket 是异步的;它与Main 不在同一线程上运行,因此,您的程序在收到连接之前就结束了。要解决此问题,请转换为同步 Accept 或保持主线程处于活动状态以防止您的程序关闭。我建议您在使用此类方法之前阅读 implications of asynchronous methods 是什么。

    我需要查看您的 ManualResetEvent 代码来回答这个问题,但“无关字节”对我来说毫无意义,因为我不知道您在期待什么或得到什么。另外,我认为使用ManualResetEvent 同时在完全相同的地方使用异步方法确实违背了首先使用异步方法的目的。

    【讨论】:

    • 我明白了,现在一切都清楚了。我目前正在阅读您给我的文章,我意识到我的错误。为了防止我的线程关闭,我可以创建另一个线程并在那里运行它或使用接受方法阻止任何活动,直到套接字被接受。
    • to prevent my thread from closing i can create another thread - 你为什么不在主线程上运行网络代码并阻塞?当然,当您需要该功能(即制作服务器应用程序)时,您应该切换到非阻塞异步代码,但如果您不需要它,您现在不应该考虑它。此外,创建新线程并不能保证防止主机进程被关闭,因为线程可以创建为守护进程。最后,async/await 或 async 模式并没有完全创建一个新线程,它比这更深入一些。
    • 我不喜欢ManualResetEvent,代码不可读,我想知道在不阻塞线程的情况下使用函数(BeginAcceptSocket)的另一种方法。
    • 您可以在不阻塞线程的情况下使用BeginAcceptSocket,但在您给出的示例中,您的程序将始终退出,因为没有任何东西保持打开状态。创建一个新线程并不能解决这个问题,因为BeginAcceptSocket (et al) 不保证它们何时启动或返回并且它们不会阻塞。
    • 您可以根据需要使用BeginAcceptSocket,也就是说,您必须有一些东西来阻止 Main 方法返回(一旦 Main 方法返回,您的程序就会终止)。不幸的是,非阻塞套接字本质上不会阻止这种情况的发生。 :) 我只是提到这一点,因为这就是你的例子中的内容
    猜你喜欢
    • 2012-01-16
    • 2018-01-10
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多