【问题标题】:C# TCPListener IssueC# TCPListener 问题
【发布时间】:2016-03-17 22:54:28
【问题描述】:

我有以下代码可以在我的计算机上侦听 localhost 上的 TCP/IP 连接。当我运行应用程序(WPF 应用程序)时,我收到以下错误消息。

感谢任何帮助。

谢谢。

更新代码:

try
{
    string sConnectionString = "Data Source=xxxx;Initial Catalog=xxxx;Integrated Security=false;User ID=xxxx;Password=xxxx";

    IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
    Console.WriteLine("Starting TCP listener...");

    TcpListener listener = new TcpListener(ipAddress, 13002);

    listener.Start();

    while (true)
    {
        Console.WriteLine("Server is listening on " + listener.LocalEndpoint);

        Socket client = listener.AcceptSocket();

        var childSocketThread = new Thread(() =>
        {
            byte[] data = new byte[100];
            int size = client.Receive(data);

            string incomingMess = " ";

            for (int i = 0; i < size; i++)
                incomingMess = incomingMess + Convert.ToChar(data[i]);

            Console.WriteLine("---> Message recorded in DB");
            Console.WriteLine(System.Environment.NewLine);

            SqlConnection con = new SqlConnection(sConnectionString);

            string regMess = "insert into Messages(incomingMessage) values(@incomingMessage_param)";
            SqlCommand regMessCommand = new SqlCommand(regMess, con);

            con.Open();
            regMessCommand.Parameters.AddWithValue("@incomingMessage_param", incomingMess);
            regMessCommand.ExecuteNonQuery();
            con.Close();

            client.Close();
        });
        childSocketThread.Start();
    }

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

【问题讨论】:

  • 错误信息是什么?--您只是向我们展示了 StackTrace。
  • 看到来自System.Net.Sockets.Socket.Bind(EndPoint localEP) 的堆栈跟踪可能是因为其他东西在监听它而无法绑定到端口 13000?
  • 是的 - 错误是什么?不过,不要将该代码放入构造函数中,请使用 Window.Loaded 或计时器延迟。
  • 确保你的防火墙允许你绑定。联网时,我建议最初关闭防火墙,然后在最后重新打开
  • @JeffRSon——哦,是的,哇。我错过了。如果侦听器工作,窗口将永远不会显示 - 代码被设计为永远循环,并且由于它位于窗口构造函数中,因此该窗口将永远无法显示,除非您在构造函数中遇到异常。

标签: c# tcplistener


【解决方案1】:

我希望您的程序之前已绑定到此端口,并且当您从其循环中终止进程时,该端口尚未释放 - 如果您将端口号更改为 13001/13002/13003/其他随机,你发现你仍然得到异常吗?

【讨论】:

  • 后退一步:我们想创建一个应用程序,它可以 24/7 全天候接收来自外部设备的消息。在这种情况下,IP 地址将是服务器的 IP,但我想知道应该如何选择端口号?到目前为止,我已将代码移至 Form_Load(现在我使用 Forms 而不是 WPF)并将端口更改为 13001。但是,我仍然收到相同的 StackTrace 信息(如果我不跟踪它,我不会收到任何错误消息但我看到整个代码都没有执行)。
  • 好的,你能用你的新代码更新主要问题吗?此外,如果您可以描述您希望从这些设备接收的数据类型,这也可能会影响解决方案
  • 代码在控制台应用程序中没有任何问题。我更新了上面的代码。
猜你喜欢
  • 1970-01-01
  • 2011-07-20
  • 2014-04-03
  • 1970-01-01
  • 2011-04-07
  • 2012-05-13
  • 2011-10-06
  • 1970-01-01
  • 2012-11-02
相关资源
最近更新 更多