IPEndPoint на стороне клиента не может использовать IPAddress.Any?

Я изучал программирование сокетов, я создал асинхронный сервер, который только слушает и возвращает данные.

но у меня есть проблема, я использую IPEndPoint на сервере с IPEndPoint(IPAddress.any,port), и я делаю то же самое на стороне клиента. При запуске сервера и клиента я использую try catch, а клиентская сторона возвращает свое исключение, как это

«Запрошенный адрес недействителен в контексте 0.0.0.0:порт»

вот ниже код:

Сервер.cs

      Public void Listen()
      {
        IPEndPoint IpEnd = new IPEndPoint(IPAddress.Any, 11000);

        Console.WriteLine("Create new socket");
        mainSocket = new Socket(AddressFamily.InterNetwork,
                       SocketType.Stream,ProtocolType.IP);

        Console.WriteLine("Bind the socket");
        mainSocket.Bind(IpEnd);

        Console.WriteLine("Listening to socket");
        mainSocket.Listen(10);

        Console.WriteLine("Waiting Connection");
        mainSocket.BeginAccept(new AsyncCallback(AcceptConnect), null);
      }
      protected void AcceptConnect(IAsyncResult ar)
      {
        try
        {
            Socket client = mainSocket.EndAccept(ar);
            SessionData session = new SessionData();
            Console.WriteLine("Connection Accepted, waiting for Data");
            Console.WriteLine("Waiting a new Connection");
            mainSocket.BeginAccept(new AsyncCallback(AcceptConnect), null);
            try{
                session.clientSocket = client;
                client.BeginReceive(session.buffer,0,SessionData.buffersize,0, 
                                    new AsyncCallback(ReceiveData), session);
            }catch(Exception e){
                client.Send(ASCIIEncoding.Default.GetBytes(e.Message));
                Console.WriteLine(e.Message);
            }
        }
        catch(Exception e)
        {
            Console.WriteLine(e.Message);
            Console.WriteLine(e.StackTrace);
        }
      }

Клиент.cs

    public void ClientConnect()
    {

        // Create a TCP/IP socket.
        Socket client = new Socket(AddressFamily.InterNetwork, 
                        SocketType.Stream, ProtocolType.Tcp);

        IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, 11000);

        // Connect to the remote endpoint.
        client.BeginConnect(remoteEP, new AsyncCallback(ConnectServer), client);
    }
    public void ConnectServer(IAsyncResult ar) 
    {
        try
        {
            Socket client = (Socket)ar.AsyncState;
            client.EndConnect(ar);

            Console.WriteLine("Socket connected to {0}", 
                             client.RemoteEndPoint.ToString());
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
    }

мой вопрос:

  1. Нужно ли клиенту указывать на один IP-адрес?
  2. Я просто использую неправильный код на сервере?

person Diom    schedule 20.03.2013    source источник
comment
Да, клиенту нужна определенная конечная точка для подключения. На сервере 0.0.0.0 означает прослушивание любого возможного интерфейса, но как клиент вы должны указать, к кому вы пытаетесь подключиться.   -  person Joe    schedule 20.03.2013
comment
Я отредактировал ваш заголовок. См. Должны ли вопросы включать «теги» в свои заголовки?, если нет единого мнения, не следует.   -  person John Saunders    schedule 20.03.2013
comment
Спасибо за ответ, Джо, но даже если я изменю IP, он все равно выдаст мне ошибку, соединение не удалось, потому что сторона соединения не ответила должным образом или не ответила, в чем проблема сейчас?   -  person Diom    schedule 20.03.2013
comment
@JohnSaunders, тогда хорошо, извините за неправильные названия... и спасибо...   -  person Diom    schedule 20.03.2013


Ответы (1)


Клиент должен указывать на определенный IP-адрес (например, 192.168.1.101 или что-то подобное), вы не можете отправлять пакеты на IP 0.0.0.0. Причина, по которой сервер может принимать IP.Any, заключается в том, что он прослушивает все IP-адреса на локальном компьютере, который представлен как 0.0.0.0.

person Zipper    schedule 20.03.2013
comment
Итак, в конце концов клиент не может использовать IPAddress.Any? Хорошо, тогда я думаю, что мой ответ попытается изменить IP. Выложу сюда результат. - person Diom; 20.03.2013
comment
Хорошо, я изменил IP-адрес на 192.168.0.101, он выдал мне ошибку, в которой говорилось, что соединение не удалось, потому что сторона соединения не ответила должным образом или не ответила. Так в чем проблема? - person Diom; 20.03.2013
comment
Действительно ли серверная машина имеет IP-адрес 192.168.0.101? - person Zipper; 20.03.2013
comment
ну, я использовал тот же компьютер, что и сервер, чтобы попробовать его, так что это не должно быть проблемой, верно?? - person Diom; 20.03.2013
comment
Ну, IP-адрес должен быть таким же, как IP-адрес сервера. Поэтому, если клиент и сервер находятся на одном компьютере, это должен быть IP-адрес этого компьютера. - person Zipper; 20.03.2013
comment
Так вот почему! Хорошо, тогда спасибо за ваше время, @Zipper. Это мне очень помогает. - person Diom; 20.03.2013