2013-03-20 2 views
1

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

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

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

здесь ниже код:

Server.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); 
     } 
     } 

Client.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. Я просто использую неправильный код на сервере?
+0

Да, клиенту требуется конкретная конечная точка для подключения. На сервере 0.0.0.0 означает «прослушивать любой возможный интерфейс», но в качестве клиента вы должны указать, к кому вы пытаетесь подключиться. – Joe

+0

Я отредактировал ваш заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

+0

Спасибо за ответ Джо, но даже если я изменил IP-адрес, он все равно дал мне ошибку, «соединение не удалось, потому что сторона связи неправильно ответила или не ответила», в чем проблема сейчас? – Diom

ответ

1

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

+0

поэтому, в конце концов клиент не может использовать IPAddress.Any? Хорошо, тогда, я думаю, вот мой ответ попытается изменить IP. Выведет здесь результат этого. – Diom

+0

ОК, я изменил IP-адрес на 192.168.0.101, его сообщение об ошибке сообщило, что «соединение не удалось, потому что сторона соединения неправильно ответила или не ответила». Так в чем проблема? – Diom

+0

Действительно ли серверный компьютер имеет IP-адрес 192.168.0.101? – Zipper

Смежные вопросы