Как подключить компьютеры через IPAddress

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

c#,sockets,networking,

2

Ответов: 2


3 принят

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

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

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

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


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

серверный код

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"); }
    }
  }
}

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

C #, розетки, сети,
Похожие вопросы