9

I have some kind of problem and I can't check this at home if its working or not. Here is the code

using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.IO;
using System.Net.Security;

class Program
{
    private static IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
    private static int port = 6000;
    private static string data = null;

    static void Main(string[] args)
    {
        Thread thread = new Thread(new ThreadStart(receiveThread));
        thread.Start();
        Console.ReadKey();
    }

    public static void receiveThread()
    {
        while (true)
        {
            TcpListener tcpListener = new TcpListener(ipAddress, port);
            tcpListener.Start();

            Console.WriteLine("Waiting for connection...");

            TcpClient tcpClient = tcpListener.AcceptTcpClient();

            Console.WriteLine("Connected with {0}", tcpClient.Client.RemoteEndPoint);

            while (!(tcpClient.Client.Poll(20, SelectMode.SelectRead)))
            {
                NetworkStream networkStream = tcpClient.GetStream();
                StreamReader streamReader = new StreamReader(networkStream);

                data = streamReader.ReadLine();

                if(data != null)
                    Console.WriteLine("Received message: {0}", data);
            }
            Console.WriteLine("Dissconnected...\n");
            tcpListener.Stop();
        }
    }
}

I have a simple program as well to connect to this and then send a string with data. It works fine on localhost but there is a problem when I'm trying to connect with a different coputer.

I even turned off the firewall on my PC and router, as I did on my friend's laptop. Every time I have tried to connect, his computer refused connection. Maybe I'm doing something wrong?

Of course, ipAddress is a local address now since it's only working with that at the moment. Any suggestions what to do?

4

4 に答える 4

14

任意の IP からの接続を受け入れるように設定する必要があります。これには IPAddress オーバーロード関数があります。

System.Net.IPAddress.Any

127.0.0.1 の代わりに使用すると、問題が解決します。

于 2009-12-02T10:04:39.120 に答える
4

「このコンピュータ」を意味する特別なアドレスであるループバック アドレスである 127.0.0.1 でリッスンしています。これは、サーバーが実行されているのと同じマシンで行われた接続のみを受け入れることを意味します。

サーバーの実際の IP アドレスの 1 つ (または複数) でリッスンする必要があります。

于 2009-12-02T10:01:09.153 に答える
3

問題は、TcpListener を初期化するときに IP アドレスを明示的に設定すると、そのアドレスからの接続しか受け入れられなくなることです。したがって、127.0.0.1 のローカル アドレスを入力すると、PC からの接続のみが受け入れられます。

使用する実装は次のとおりです。

TcpListener tcpListener = new TcpListener(IPAddress.Any, port);

これにより、任意の IP アドレスからの接続が、指定されたポートでプログラムに接続できるようになります。

于 2009-12-02T10:03:32.113 に答える
1

127.0.0.1 がローカル (-only) であるため、接続を拒否するのはあなたのコンピューター (サーバー) だと思います。

この単純なオーバーロードを試してください:

  TcpListener tcpListener = new TcpListener(port);
于 2009-12-02T09:48:37.410 に答える