Как подключить компьютеры через IPAddress - PullRequest
2 голосов
/ 16 октября 2011

Это связано с c # сокетами.Я разрабатываю программу для сокетов.Но есть одна проблема в моем программном обеспечении.Я не могу подключиться к компьютерам, которые подключены к Интернету через их локальную сеть.Но я могу подключиться к компьютерам, которые используют Интернет в одиночку.Будьте более наглядным, учтите, что 5 компьютеров подключаются к Интернету через модем, который использует 1 IP-адрес.Когда я пытаюсь связаться с одним из этих компьютеров, API подключается к модему через его IP-адрес.Но ответа нет.Потому что модем не отвечает на запрос компьютера.Между прочим, мой API должен достигать компьютера не только модема.И еще и SocketException выбрасывается.Что я могу сделать с этой проблемой?

Ответы [ 2 ]

3 голосов
/ 16 октября 2011

Проблема, с которой вы столкнулись, вызвана NAT . Это используется маршрутизаторами, которые позволяют нескольким клиентам подключаться к сети через один публичный IP-адрес. Ни один из клиентов за маршрутизатором не будет «знать» или «видеть» это, но это ограничивает возможности соединения.

Клиенты могут инициировать соединение с внешней стороной, но, наоборот, в принципе * невозможно. Если вы не используете перенаправление портов , где один или несколько портов перенаправляются клиенту за маршрутизатором. Таким образом, соединения могут быть инициированы извне.

Однако это требует настройки на стороне клиента, поэтому предпочтительным способом будет позволить вашим клиентам подключаться к вашему серверу, поскольку это всегда будет возможно (брандмауэры игнорируются).

*: Существует также обходной путь, при котором вы позволяете клиенту подключаться к вашему серверу, а затем передавать информацию о соединении другому клиенту, чтобы эти клиенты могли общаться друг с другом. Это называется «nat punching» и используется, например, торрент-клиентами.

1 голос
/ 16 октября 2011

вы можете попробовать что-то вроде этого .....

Код серверной стороны

namespace Consoleserver
{
class Program
{
    static void Main(string[] args)
    {

        IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
    IPAddress ipAddress = ipHostInfo.AddressList[0];
    IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);


    Socket listener = new Socket(AddressFamily.InterNetwork,
        SocketType.Stream, ProtocolType.Tcp );


    try
    {
        listener.Bind(localEndPoint);
        listener.Listen(10);


        while (true)
        {
            Console.WriteLine("Waiting for a connection...");

            Socket handler = listener.Accept();
            Console.WriteLine("connected");
        }

    }
    catch { Console.WriteLine("error"); 
    }
  }
}

Код на стороне клиента:

 namespace consoleclient
 {
   class Program
   {
    static void Main(string[] args)
    {
        try
        {

            IPHostEntry ipHostInfo = Dns.Resolve("59.178.131.180");
            IPAddress ipAddress = ipHostInfo.AddressList[0];
            IPEndPoint remoteEP = new IPEndPoint(ipAddress, 11000);


            Socket sender = new Socket(AddressFamily.InterNetwork,
                SocketType.Stream, ProtocolType.Tcp);


            try
            {
                sender.Connect(remoteEP);

                Console.WriteLine("Socket connected <strong class="highlight">to</strong> {0}",
                    sender.RemoteEndPoint.ToString());
            }
            catch (ArgumentNullException ane)
            {
                Console.WriteLine("ArgumentNullException : {0}", ane.ToString());
                Console.Read();
            }
            catch (SocketException se)
            {
                Console.WriteLine("SocketException : {0}", se.ToString());
                Console.Read();
            }
            catch (Exception e)
            {
                Console.WriteLine("Unexpected exception : {0}", e.ToString());
                Console.Read();
            }

        }
        catch
        { Console.WriteLine("could not <strong class="highlight">connect</strong> A"); }
    }
  }
}

Я надеюсь, что это поможет вам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...