C#TcpClient无法连接

时间:2014-10-25 13:44:40

标签: c# tcpclient

我创建了一个与LAN中的其他计算机连接的类。当我引入方法连接第一次时一切正常,但在工作类之后变量会丢失对该对象的引用。

但是,如果我尝试再次创建此对象并引发方法连接我有一个错误,即"Only one using each socket adress(protocol / network address / port) is permitted"

这个错误是我尝试做的时候

partner.Connect(partnerIPEndPoint);

我班上有什么不好的?如果有人能帮助我,我将不胜感激。 提前谢谢。

这是我的班级:

using System;
using System.Net;
using System.Net.Sockets;
using System.Diagnostics;


namespace AudioNetwork
{
    class ConnectToServer : IDisposable
    {
        public int BeepAmonut { get; set; }
        public int Speed { get; set; }
        public IPAddress MyIPAddress { get; set; }
        public IPAddress PartnerIPAddress { get; set; }
        private NetworkStream stream;
        private TcpClient partner;


        public void Connect()
        {
           IPEndPoint myIPEndPoint = new IPEndPoint(MyIPAddress, 800);
           IPEndPoint partnerIPEndPoint = new IPEndPoint(PartnerIPAddress, 800);
           partner = new TcpClient(myIPEndPoint);              

           partner.Connect(partnerIPEndPoint);
           stream = partner.GetStream();
           Messanger(stream);
        }

        protected virtual void Messanger(NetworkStream myStream)
        {
            byte[] data = { 2, 1 };

            myStream.Write(data, 0, data.Length);
            Play(2000);

        }

        public void Play(int time)
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();
            while (sw.ElapsedMilliseconds <= 2100)
            {
                if (sw.ElapsedMilliseconds >= time)
                {
                    break;
                }
            }
        }

        public void Dispose()
        {
            GC.SuppressFinalize(this);
            stream.Dispose();
            stream.Close();
            partner.Client.Dispose();
            partner.Close();
        }
    }

    class ConnectToClient : ConnectToServer
    {
        protected override void Messanger(NetworkStream myStream)
        {
            byte[] data = new byte[256];
            int bytes = myStream.Read(data, 0, data.Length);
            if (data[0] == 2)
            {
                Play(1980);
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您将硬编码端口分配给本地端点,并且不要将其关闭。

  • 当您打开第一个连接时,端口800上的本地套接字连接到端口800上的远程套接字。
  • 然后您忘记关闭此连接(因为您从未在Disposesteam上致电partner - 我看不到您的Dispose函数在任何地方被调用了< / LI>
  • 当您尝试在本地端口800上打开第二个连接时,它已被第一个连接占用,这会导致您遇到的错误。

解决方案是让操作系统为本地套接字分配一个自动端口号。那样:

  • 当您打开第一个连接时,您在自动分配的端口号上有一个本地套接字,该端口号连接到端口800上的远程套接字。
  • 当您打开第二个连接时,即使第一个连接尚未关闭,操作系统也会为第二个插槽分配不同的端口号,并将其连接到端口800的远程插槽。

在代码中,这将是简单的:

partner = new TcpClient(); 

摆脱所有MyIPAddress的东西。