1

ネットワーク アドレスが 192.168.xxx.xxx ポート xxxx のデバイスがあります。これは私のネットワークで有効なアドレスです。サーバーへの接続を確立するために TCPListener を使用しようとしましたが、「エラー..... System.Net.Sockets.SocketException: The requested address is not valid in its context at System.Net.Sockets.Socket. System.Net.Sockets.Socket.Bind(EndPoint localEP) の DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) System.Net.Sockets.TcpListener.Start(Int32 backlog) の System.Net.Sockets.TcpListener.Start() の WinMarkTest .Server.Main() in 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 に答える