C# 如何使用TCPListener(或其他方法)绑定到网络上的设备

C# 如何使用TCPListener(或其他方法)绑定到网络上的设备,c#,client-server,tcpclient,tcplistener,C#,Client Server,Tcpclient,Tcplistener,我有一个网络地址为192.168.xxx.xxx端口xxxx的设备。这是我网络上的有效地址。我尝试使用TCPListener为服务器建立连接,但收到错误消息 “错误…..System.Net.Sockets.SocketException:请求的地址在其上下文中无效 位于System.Net.Sockets.Socket.DoBind(端点端点快照,SocketAddress socketAddress) 位于System.Net.Sockets.Socket.Bind(端点localEP) 在

我有一个网络地址为192.168.xxx.xxx端口xxxx的设备。这是我网络上的有效地址。我尝试使用TCPListener为服务器建立连接,但收到错误消息 “错误…..System.Net.Sockets.SocketException:请求的地址在其上下文中无效 位于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:…\Server.cs中的WinMarkTest.Server.Main()处:第49行“

当我使用myListener.Start()方法时

“本地地址”是指使用TCPListener的服务器的地址吗


我还可以用其他方式连接。该设备位于我的内部网络(防火墙的我一侧)内

TcpListener将在服务器上运行,等待连接到特定端口。TcpClient将用于连接到192.168.xxx.xxx:xxxx地址。因此,当您执行Listener.Start时,您正在侦听运行侦听器的地址和端口上与侦听器的连接。本地地址是指您正在侦听的连接地址

如果要连接到远程ip:端口,则应尝试TcpClient。一个简单的测试是看你是否可以连接到smtp服务器或类似的东西

编辑:--包括一个非常粗糙的示例,用于连接并向pop.google.com发送/接收数据

static void Main(string[] args)
    {
        Stream networkStream = null;
        string hostName = "pop.gmail.com";
        int port = 995;
        TcpClient client = new TcpClient();
        MemoryStream dataStream = new MemoryStream();
        try
        {

            client.SendTimeout = 15000;
            client.ReceiveTimeout = 15000;
            client.Connect(hostName, port);
            networkStream = new SslStream(client.GetStream(), true);
            ((SslStream)networkStream).AuthenticateAsClient(hostName);
            const int ChunkSize = 256;
            int bytesRead = 0;
            const int BufferSize = 1024;
            byte[] buffer = new byte[BufferSize];

            //CONNECT SHOULD GET BANNER
            string messageReceived;
            using (dataStream = new MemoryStream())
            {
                do
                {
                    bytesRead = networkStream.Read(buffer, 0, ChunkSize);
                    dataStream.Write(buffer, 0, bytesRead);
                    messageReceived = Encoding.UTF8.GetString(dataStream.ToArray());
                } while (!messageReceived.EndsWith(Environment.NewLine));

                Console.WriteLine("Response:{0}", Encoding.UTF8.GetString(dataStream.ToArray()));
            }

            buffer = Encoding.UTF8.GetBytes("USER test.net.user@gmail.com\r\n");

            networkStream.Write(buffer, 0, buffer.Length);

            buffer = new byte[BufferSize];
            using (dataStream = new MemoryStream())
            {
                do
                {
                    bytesRead = networkStream.Read(buffer, 0, ChunkSize);
                    dataStream.Write(buffer, 0, bytesRead);
                    messageReceived = Encoding.UTF8.GetString(dataStream.ToArray());
                } while (!messageReceived.EndsWith(Environment.NewLine));

                Console.WriteLine("Response:{0}", Encoding.UTF8.GetString(dataStream.ToArray()));
            }
        }
        catch (Exception e)
        {
            Console.Write(e);
        }
        finally
        {
            if (networkStream != null)
            {
                networkStream.Dispose();
                networkStream = null;
            }
            if (client != null)
            {
                if (client.Connected)
                {
                    client.Client.Disconnect(false);
                }
                client.Close();
                client = null;
            }
        }

        Console.ReadKey();
    }

TcpListener将在服务器上运行,等待连接到特定端口。TcpClient将用于连接到192.168.xxx.xxx:xxxx地址。因此,当您执行Listener.Start时,您正在侦听运行侦听器的地址和端口上与侦听器的连接。本地地址是指您正在侦听的连接地址

如果要连接到远程ip:端口,则应尝试TcpClient。一个简单的测试是看你是否可以连接到smtp服务器或类似的东西

编辑:--包括一个非常粗糙的示例,用于连接并向pop.google.com发送/接收数据

static void Main(string[] args)
    {
        Stream networkStream = null;
        string hostName = "pop.gmail.com";
        int port = 995;
        TcpClient client = new TcpClient();
        MemoryStream dataStream = new MemoryStream();
        try
        {

            client.SendTimeout = 15000;
            client.ReceiveTimeout = 15000;
            client.Connect(hostName, port);
            networkStream = new SslStream(client.GetStream(), true);
            ((SslStream)networkStream).AuthenticateAsClient(hostName);
            const int ChunkSize = 256;
            int bytesRead = 0;
            const int BufferSize = 1024;
            byte[] buffer = new byte[BufferSize];

            //CONNECT SHOULD GET BANNER
            string messageReceived;
            using (dataStream = new MemoryStream())
            {
                do
                {
                    bytesRead = networkStream.Read(buffer, 0, ChunkSize);
                    dataStream.Write(buffer, 0, bytesRead);
                    messageReceived = Encoding.UTF8.GetString(dataStream.ToArray());
                } while (!messageReceived.EndsWith(Environment.NewLine));

                Console.WriteLine("Response:{0}", Encoding.UTF8.GetString(dataStream.ToArray()));
            }

            buffer = Encoding.UTF8.GetBytes("USER test.net.user@gmail.com\r\n");

            networkStream.Write(buffer, 0, buffer.Length);

            buffer = new byte[BufferSize];
            using (dataStream = new MemoryStream())
            {
                do
                {
                    bytesRead = networkStream.Read(buffer, 0, ChunkSize);
                    dataStream.Write(buffer, 0, bytesRead);
                    messageReceived = Encoding.UTF8.GetString(dataStream.ToArray());
                } while (!messageReceived.EndsWith(Environment.NewLine));

                Console.WriteLine("Response:{0}", Encoding.UTF8.GetString(dataStream.ToArray()));
            }
        }
        catch (Exception e)
        {
            Console.Write(e);
        }
        finally
        {
            if (networkStream != null)
            {
                networkStream.Dispose();
                networkStream = null;
            }
            if (client != null)
            {
                if (client.Connected)
                {
                    client.Client.Disconnect(false);
                }
                client.Close();
                client = null;
            }
        }

        Console.ReadKey();
    }

下面是一个如何在MSDN上使用TcpClient的示例,非常简单。我感谢你的评论/回答。我还在努力。DCI正在按照msdn教程使用TcpClient。但它也只使用TcpListener,它在端口上侦听任何地址。但是我的代码从来不会在“TcpClient client=this.tcpListener.AcceptTcpClient();”之后执行,因此无论出于何种原因,客户端永远不会连接到服务器。有什么想法吗?我知道我在正确的港口和地址。我已经ping了仪表并使用了OEM软件,因此我知道仪表有一些响应。。。。DCOk,我还是不明白你为什么要用TcpListener,你是在做服务器还是在连接服务器?我更新了我的帖子,加入了一个非常粗糙的控制台应用程序示例,它连接到gmail并发送/接收数据。从您最初的帖子来看,您似乎正在尝试连接到远程服务器。请详细说明你想做什么。谢谢。从家里连接到Gmail很好,但从我的工作网络上,我收到了一个例外,“主机主动拒绝连接。”我会继续。是的,我正在尝试从电能表发送命令和接收数据。因此,我正在尝试连接到服务器。感谢您的耐心。下面是一个如何在MSDN上使用TcpClient的示例,非常简单。我感谢你的评论/回答。我还在努力。DCI正在按照msdn教程使用TcpClient。但它也只使用TcpListener,它在端口上侦听任何地址。但是我的代码从来不会在“TcpClient client=this.tcpListener.AcceptTcpClient();”之后执行,因此无论出于何种原因,客户端永远不会连接到服务器。有什么想法吗?我知道我在正确的港口和地址。我已经ping了仪表并使用了OEM软件,因此我知道仪表有一些响应。。。。DCOk,我还是不明白你为什么要用TcpListener,你是在做服务器还是在连接服务器?我更新了我的帖子,加入了一个非常粗糙的控制台应用程序示例,它连接到gmail并发送/接收数据。从您最初的帖子来看,您似乎正在尝试连接到远程服务器。请详细说明你想做什么。谢谢。从家里连接到Gmail很好,但从我的工作网络上,我收到了一个例外,“主机主动拒绝连接。”我会继续。是的,我正在尝试从电能表发送命令和接收数据。因此,我正在尝试连接到服务器。感谢您的耐心等待。使用TcpClient连接到您的服务器。使用TcpClient连接到您的服务器。