Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# TcpListener没有';t连接/建立连接_C#_Sockets_Connection_Byte_Tcplistener - Fatal编程技术网

C# TcpListener没有';t连接/建立连接

C# TcpListener没有';t连接/建立连接,c#,sockets,connection,byte,tcplistener,C#,Sockets,Connection,Byte,Tcplistener,我尝试在没有ManualResetEvent的情况下启动连接,它只是跳过BeginAcceptSocket,告诉我按任意键继续,尽管使用ManualResetEvent我成功地获得了连接,但客户端向我发送了不相关的字节 static void Main(string[] args) { tcpListener = new TcpListener(IPAddress.Any, 8484); tcpListener.Start(); t

我尝试在没有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);
    }

例如,将客户视为传入字节的接受者。

<代码> SeaRealtStuts是异步的;它与

Main
不在同一线程上运行,因此,您的程序将在收到连接之前结束。要解决此问题,请转换为同步
Accept
或保持主线程处于活动状态以防止程序关闭。我建议你在使用这些方法之前,先仔细阅读这些方法的原理


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

我明白了,现在一切都清楚了。我正在读你给我的文章,我意识到我的错误。为了防止我的线程关闭,我可以创建另一个线程并在那里运行它,或者使用accept方法阻止任何活动,直到套接字被接受。
为了防止我的线程关闭,我可以创建另一个线程
-为什么不在主线程上运行带有阻塞的网络代码?当然,当您需要非阻塞异步代码时(即创建服务器应用程序),您应该切换到非阻塞异步代码,但是如果您不需要它,那么现在就不应该考虑它。另外,创建新线程并不能保证防止主机进程关闭,因为线程可以创建为守护进程。最后,async/await或async模式并没有创建一个新线程,它比这更深入一些。我不喜欢ManualResetEvent,代码不可读,我想知道在不阻塞线程的情况下使用函数(BeginAcceptSocket)的另一种方法。你可以使用
BeginAcceptSocket
,而不阻塞线程,但在您给出的示例中,您的程序将始终退出,因为没有任何东西使它保持打开状态。创建一个新线程并不能解决这个问题,因为
BeginAcceptSocket
(et al)不保证它们何时启动或返回,也不阻塞。如果您愿意,可以使用
BeginAcceptSocket
,也就是说,您必须有一些东西来阻止主方法返回(一旦Main方法返回,您的程序就会终止)。不幸的是,非阻塞套接字本质上不会阻止这种情况的发生。:)我之所以提到这一点,是因为在您的示例中就是这样