【问题标题】:No connection could be made because the target machine actively refused it why?无法连接,因为目标机器主动拒绝,为什么?
【发布时间】:2013-07-31 05:20:55
【问题描述】:

您好,我正在使用 TCPCLient 和 TCPlitner 来传输数据,但是我收到了无法连接的错误 下面是我的代码

 private void button1_Click(object sender, EventArgs e)
 {
    TcpClient tcpc = new TcpClient("192.168.21.46", 10);            
    NetworkStream nts = tcpc.GetStream();
    if (nts.CanWrite)
    {
         Byte[] sends = System.Text.Encoding.ASCII.GetBytes(textBox1.Text.ToCharArray());
         nts.Write(sends, 0, sends.Length);
         nts.Flush();
    }
}

private void button2_Click(object sender, EventArgs e)
{
    TcpListener myListener = new TcpListener(10);
    myListener.Start();
    while (true)
    {
        //Accept a new connection
        Socket mySocket = myListener.AcceptSocket();
        if (mySocket.Connected)
        {                   
            //make a byte array and receive data from the client 
            Byte[] receive = new Byte[64];
            int i = mySocket.Receive(receive, receive.Length, 0);
            char[] unwanted = { ' ', ' ', ' ' };
            string rece = System.Text.Encoding.ASCII.GetString(receive);
            label1.Text = rece.TrimEnd(unwanted);                  
        }
    }
}

我以相同的形式添加了这两个按钮,并且提到的 IP 地址是我的系统 IP 地址。谁能告诉我为什么会发生这种情况。即使我也删除了防火墙设置。

【问题讨论】:

  • 你同时按了两个按钮,不然我什么都不懂……
  • 目标机器上的端口是否可以免费使用?
  • @Heather 第一个按钮点击连接套接字然后传输,第二个按钮接收数据
  • ...我认为您没有打开的套接字可以连接。

标签: c# sockets


【解决方案1】:

首先,您的 UI 将挂在按钮 2 单击上,因为它卡在 while(true) 循环上,因此请使用 BeginAcceptSocket(IAsyncResult r, Object state) 进行异步。

其次,您必须使用环回地址,否则防火墙应该阻止端口 10,假设它没有打开。此外 TcpListener(int port) 已过时,最好使用 TcpListener(IPAddress localddr, int port) 并同时使用环回地址。

【讨论】:

    【解决方案2】:

    我假设您有两个不同的程序,一个正在收听,另一个正在发送。如果你不这样做,请将它们分开。我认为您遇到了网络问题,但无法准确说明它被阻止的原因。

    您正在使用端口 10,对于任意应用程序使用而言,该端口通常太低,即使它当前没有被占用。如果您正在构建自定义协议,请尝试侦听大约 1000 以上的端口(更多经验法则)。您可以在此处查看http://technet.microsoft.com/en-us/library/cc959828.aspx 或谷歌“tcp 知名端口”以获取更多详细信息并确保不会发生冲突。

    尝试运行 TCP 侦听器,然后打开命令提示符并键入以下内容

    telnet localhost 10
    

    或使用您将 10 更改为的端口号。我尝试了您的代码,并且能够毫无问题地连接到端口 10。如果您没有“telnet”程序,您可以在 Windows 中打开该功能。 (搜索“功能”并选择“打开或关闭 Windows 功能”然后打开“Telnet 客户端”)

    如果 telnet 程序连接,您就会知道问题与连接无关。如果 telnet 程序无法连接,那么您就会知道某些东西仍在阻塞该端口。尝试不同的端口并重新测试连接性。 telnet 连接后,您就可以专注于程序的 TCP 客户端部分。

    【讨论】:

    • 目标机器是相同的,即使我打开了 telnet 的功能但遇到同样的问题,现在我使用高端口号但没有运气。实际上我想从一个 exe 发送一些数据到另一个exe,为此我正在使用它。但我卡住了连接 tcp。
    猜你喜欢
    • 2014-05-09
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 2021-11-26
    相关资源
    最近更新 更多