2013-03-20 103 views
1

我一直在学习一些套接字编程,我创建了一个只侦听并返回数据的异步服务器。客户端IPEndPoint无法使用IPAddress.Any?

但我在这里有一个问题,我在IPEndPoint(IPAddress.any,端口)服务器上使用IPEndPoint,并且我在客户端执行相同的操作。当运行在服务器和客户端,我使用尝试捕捉和客户端返回它的异常喜欢这个

“的请求的地址是无效的上下文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 2013-03-20 03:34:34

+0

我编辑了你的标题。请参见“[应的问题包括‘标签’,在他们的头衔?(http://meta.stackexchange.com/questions/19190/)”,这里的共识是“不,他们不应该”。 – 2013-03-20 03:36:42

+0

感谢您的答案乔,但即使我改变了IP它仍然给我错误,“连接失败,因为连接方没有正确响应或无法响应”,现在有什么问题? – Diom 2013-03-20 03:54:03

回答

1

客户端需要指向一个特定的IP地址(即192.168.1.101或类似的东西),你不能发送数据包到IP 0.0.0.0。服务器可以接受IP的原因是,它正在监听本地计算机上的所有IP地址,其值为0.0.0.0。

+0

那么,到底客户端不能使用IPAddress.Any?那好吧,我想,那就是我的答案会尝试改变IP。将在这里发布它的结果。 – Diom 2013-03-20 03:46:02

+0

好的,我将IP地址更改为192.168.0.101,它给了我一个错误,表示“连接失败,因为连接方没有正确响应或无法响应”。那么这里有什么问题? – Diom 2013-03-20 03:52:41

+0

服务器机器实际上是否具有IP地址192.168.0.101? – Zipper 2013-03-20 03:57:14