Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.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阻止新连接_C#_Sockets_Tcplistener - Fatal编程技术网

C# TCPListener阻止新连接

C# TCPListener阻止新连接,c#,sockets,tcplistener,C#,Sockets,Tcplistener,我被要求创建一个TCPListener控制台应用程序来监控特定端口中的传入数据。我已经搜索了一段时间,我通过LINQPad运行了以下代码: void Main() { IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); Console.WriteLine("Starting TCP listener..."); TcpListener listener = new TcpListener(ipAddress, 100

我被要求创建一个TCPListener控制台应用程序来监控特定端口中的传入数据。我已经搜索了一段时间,我通过LINQPad运行了以下代码:

void Main()
{
    IPAddress ipAddress = IPAddress.Parse("127.0.0.1");

    Console.WriteLine("Starting TCP listener...");

    TcpListener listener = new TcpListener(ipAddress, 1005);
    try
    {

        listener.Start();
        while (true)
        {
            Socket client = listener.AcceptSocket();
            client.ReceiveTimeout.Dump();
            Console.WriteLine("Connection accepted.");

            var childSocketThread = new Thread(() =>
            {
                Byte[] bytes = new Byte[256];
                String data = null;
                int i;
                while((i = client.Receive(bytes))!=0 && data != "55AA") 
                {   
                    data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
                }
                Console.WriteLine("connection closing");
                client.Close();

                //throw new Exception();
            });
            childSocketThread.Start();
        }

        listener.Stop();
    }
    catch (Exception e)
    {
        Console.WriteLine("Error: " + e.StackTrace);
        Console.ReadLine();
    }

}
这实际上是谷歌上百万个示例的一段稍加修改的代码。我的问题是,在LINQPad中,我通常会按下run按钮,然后打开命令提示符,并将telnet连接到
127.0.0.1
Port1005,然后我会写一些很好的东西

如果我按下LINQPad中的停止按钮,然后再次按下Run,则会出现以下错误:

错误:位于System.Net.Sockets.Socket.DoBind(端点端点快照,SocketAddress SocketAddress) 位于System.Net.Sockets.Socket.Bind(端点localEP) 在System.Net.Sockets.TcpListener.Start(Int32积压工作)中 在System.Net.Sockets.TcpListener.Start()中 在c:\Users\giannis\AppData\Local\Temp\LINQPad\u jncifzyi\query\u lgowqr.cs中的UserQuery.Main()处:第40行


现在,我了解到您可能只有一个客户机
在侦听
使用
特定端口,但我的问题是,首先,在使用实际解决方案之前,我想使用LINQPad。我知道我可以将TCPListener变量设置为全局变量,并在退出程序时处理它。但是如果它崩溃了或者什么的呢?在注销登录之前,我是否将无法连接到端口?

可能是,当您在LINQPad中重新启动程序时,GC尚未清理侦听器。在实际的程序中,当进程退出时,所有TCP端口都会被清除。重新启动LINQPad,您将发现端口再次可用


我不明白为什么在快速测试代码时,使用VisualStudio项目会变得更加繁重。只需按F5。不过,转储函数不存在。

正确清理TcpListener很重要,但您可以在Try语句之前添加它:listener.ExclusiveAddressUse=false

参考:

我的问题是,在取消进程后,LINQPad会保持进程运行

使用“取消所有线程并重置”菜单选项(ctrl+shift+F5)或手动终止任务管理器中的所有“LINQPad.UserQuery.exe”进程


该端口应该又是免费的。

老实说,在这里等待答复时,我确实做到了,并启动了一个项目,似乎一切都正常:-)。但通常当我只想玩游戏而不想马上开始开发时,LINQPad是我的朋友。但可能不是这样。我也只是检查了一下,实际上我不需要为了停止侦听器而处理应用程序的关闭。无论如何,您应该使用将资源包装在
中。我想这也会拯救你。我试过了,但TCPListener似乎没有实现IDisposable,所以使用似乎是不可能的,我将此标记为一个答案,因为我似乎不应该使用LINQPad来实现这一点,而vs的应对能力相当不错。谢谢你抽出时间。