TCPListener阻止新连接

时间:2014-10-24 15:14:13

标签: 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, 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();
    }

}

这实际上是对Google中数百万个示例的略微修改的代码。我的问题是在LINQPad中我通常按下运行按钮,然后打开一个命令提示符并远程登录到127.0.0.1端口1005,然后我写了一些好东西。

如果我按下LINQPad中的停止按钮然后再次按“运行”,我最终会出现以下错误:

  

错误:在System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot,SocketAddress socketAddress)      在System.Net.Sockets.Socket.Bind(EndPoint localEP)      在System.Net.Sockets.TcpListener.Start(Int32 backlog)      在System.Net.Sockets.TcpListener.Start()      在c:\ Users \ giannis \ AppData \ Local \ Temp \ LINQPad_jncifzyi \ query_lgowqr.cs中的UserQuery.Main():第40行

现在,我知道您可能只有一个客户端listeningusing一个特定的端口,但我的问题是,在进入实际解决方案之前,首先我要使用LINQPad。我知道我可以使TCPListener变量成为全局变量并在退出程序时处理它。但是,如果它崩溃或什么呢?在注销登录之前,我最终还是无法连接到端口吗?

3 个答案:

答案 0 :(得分:1)

在LINQPad中重启程序时,GC可能没有清理监听器。在实际程序中,当进程退出时,将清除所有TCP端口。重新启动LINQPad,您将再次找到该端口的空闲状态。

我不明白为什么在快速测试代码时使用Visual Studio项目会更加繁重。只需按F5。但是,转储功能不存在。

答案 1 :(得分:0)

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

参考: http://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener.exclusiveaddressuse%28v=vs.110%29.aspx

答案 2 :(得分:0)

我的问题是,LINQPad在取消后继续运行进程。

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

该端口应该再次免费。