1

我有一个网络地址为 192.168.xxx.xxx 端口 xxxx 的设备。这是我网络上的有效地址。我尝试使用 TCPListener 为服务器建立连接,但收到错误“错误..... System.Net.Sockets.SocketException:请求的地址在 System.Net.Sockets.Socket 的上下文中无效。 DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) at System.Net.Sockets.Socket.Bind(EndPoint localEP) at System.Net.Sockets.TcpListener.Start(Int32 backlog) at System.Net.Sockets.TcpListener.Start() at WinMarkTest .Server.Main() 在 C:.....\Server.cs:line 49"

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

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

我还能如何建立这种联系。该设备位于我的内部网络(我的防火墙一侧)内。

4

1 回答 1

1

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

如果要连接到远程 ip:port,则应尝试 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();
    }
于 2009-10-20T00:23:29.520 回答