2014-09-29 3 views
0

나는 여러 가지 방법으로이 작업을 시도했지만 제대로 작동하지 않는 것 같습니다. 그러나 방법이 있어야합니다.C# UDP 서버 클라이언트와의 대화

내가 (C#에서) 수행하려는 중 서버를 만드는 것입니다. 서버가 IP 및 포트에서 수신 대기하도록하고 클라이언트에 연결할 때 클라이언트가 말하는 내용을 읽고 회신을 보내주기를 원합니다. 클라이언트의 경우 서버에 연결하여 데이터를 보내고 서버로부터 응답을 수신하려고합니다.

어떻게해야합니까?

MSDN에서 Microsoft 예제와 예제를 사용했습니다. Client> data> Server가 있지만 서버 응답을 포함하지 않는 것 같습니다.

우리가 멀티 플레이어 게임을 가지고 있기 때문에 분명히 할 수 있습니다.

도움 주셔서 감사합니다.

편집 - 코드

서버에

static void Main(string[] args) 
 
     { 
 
      int recv; 
 
      byte[] data = new byte[1024]; 
 

 
      IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 904); 
 
      Socket newSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
 
      newSocket.Bind(endPoint); 
 
      Console.WriteLine("Listening for connections..."); 
 

 
      //LISTEN FOR CLIENT 
 
      IPEndPoint sender = new IPEndPoint(IPAddress.Any, 904); 
 
      EndPoint tmpRemote = (EndPoint)sender; 
 

 
      //READ MESSAGE FROM CLIENT 
 
      recv = newSocket.ReceiveFrom(data, ref tmpRemote); 
 
      Console.WriteLine("Messaged received from: " + tmpRemote.ToString()); 
 
      Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); 
 

 
      string welcome = "Welcome to server!"; 
 
      data = Encoding.ASCII.GetBytes(welcome); 
 

 
      //SEND WELCOME REPLY TO CLIENT 
 
      Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
 
      sock.Bind(tmpRemote); 
 
      sock.SendTo(data, tmpRemote); 
 
      Console.WriteLine("Reply sent to client"); 
 
      
 
       
 

 
      while (true) 
 
      { 
 
       if(!newSocket.Connected) 
 
       { 
 
        Console.WriteLine("Client disconnected."); 
 
        break; 
 
       } 
 

 
       data = new byte[1024]; 
 
       recv = newSocket.ReceiveFrom(data, ref tmpRemote); 
 
       if (recv == 0) 
 
        break; 
 

 
       Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); 
 

 
      } 
 

 
      newSocket.Close(); 
 
      Console.WriteLine("Server disconnected."); 
 
      Console.ReadLine(); 
 

 
     } 
 
    }

CLIENT에게

static void Main(string[] args) 
 
     { 
 
      Console.WriteLine("Message [127.0.0.1:904]: "); 
 
      string msg = Console.ReadLine(); 
 
      byte[] packetData = ASCIIEncoding.ASCII.GetBytes(msg); 
 
      string IP = "127.0.0.1"; 
 
      int port = 904; 
 

 
      IPEndPoint ep = new IPEndPoint(IPAddress.Parse(IP), port); 
 
      Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
 
      client.SendTo(packetData, ep); 
 
      Console.WriteLine("Data sent!"); 
 

 

 
      int recv; 
 
      byte[] data = new byte[1024]; 
 
      EndPoint tmpRemote = (EndPoint)ep; 
 

 
      while(true) 
 
      { 
 
       //READ MESSAGE FROM SERVER 
 
       recv = client.ReceiveFrom(data, ref tmpRemote); 
 
       Console.WriteLine("Messaged received from: " + tmpRemote.ToString()); 
 
       Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); 
 
      } 
 

 
      client.Close(); 
 
      Console.WriteLine("Client disconnected."); 
 
      Console.ReadLine(); 
 

 
     }

을 니펫

서버가 클라이언트와 다시 대화하고 클라이언트가 서버의 응답을 읽거나 표시하게 할 수 없습니다.

+1

코드를 표시하십시오. 어디서 붙어 있니? 또는 우리가 당신을 위해 코드 스 니펫을 던지기를 원하십니까? – atlanteh

답변

1

변경이

newSocket.SendTo(data, tmpRemote); 

에 문장

sock.SendTo(data, tmpRemote); 

이러한 문장을 제거, 당신은 두 지역의 끝점을 결합했다.

Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
sock.Bind(tmpRemote); 

인터넷에서는 UdpClient 대신 Socket 사용할 수 있습니다.

데모를 보려면 demo을보십시오.

+0

도움을 주셔서 감사합니다. – user2578216