2012-12-24 6 views
1

나는 서버에 메시지를 보내고 응답을 다시받는 UDP 클라이언트 채팅을 가지고있다. 두 개의 스레드가 있습니다. 하나는 전송 용이고 다른 하나는 메시지를 수신하기위한 것입니다. ReceiveFrom() 메서드를 사용하여 예외가 발생합니다. "이 작업을 수행하기 전에 Bind 메서드를 호출해야합니다." 그러나 이것은 클라이언트입니다, 나는 아무것도 바인딩하고 싶지 않습니다. 예를 들어,이 클라이언트는 정상적으로 작동합니다.udp 클라이언트 바인드

byte[] data = new byte[30]; 
    string input, stringData; 
    IPEndPoint servIPEP = new IPEndPoint(
      IPAddress.Parse("127.0.0.1"), 9050); 
    EndPoint servEP = (EndPoint)servIPEP; 
    Socket client = new Socket(AddressFamily.InterNetwork, 
      SocketType.Dgram, ProtocolType.Udp); 
    string welcome = "Hello, are you there?"; 
    data = Encoding.ASCII.GetBytes(welcome); 
    client.SendTo(data, data.Length, SocketFlags.None, servEP); 
    data = new byte[30]; 
    int recv = client.ReceiveFrom(data, ref servEP); //works fine! 

받는 바인딩이 없습니다. 하지만 두 개의 스레드를 만들면 오류가 발생합니다.

public ChatClient() 
     { 
      clientSock = new Socket(AddressFamily.InterNetwork, 
           SocketType.Dgram, ProtocolType.Udp); 
      servIPEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 32000); 
      servEP = (EndPoint)servIPEP; 
     } 

     public void ReceiveThread() 
     { 
      Thread receiveThread = new Thread(new ThreadStart(ReceiveData)); 
      receiveThread.Start(); 
     } 

     public void ReceiveData() 
     { 
      while(true){ 
       clientSock.ReceiveFrom(buf, ref servEP); //Here I get ERROR 
       string msg = Encoding.ASCII.GetString(buf).Trim(); 
       Console.WriteLine("New message: {0}",msg); 
       } 

     } 

     public void SendThread() 
     { 
      Thread sendThread = new Thread(new ThreadStart(SendData)); 
      sendThread.Start(); 
     } 

     public void SendData() 
     { 
      while (true) 
      { 
       Console.WriteLine("Enter message to send: "); 
       string msg = Console.ReadLine(); 
       buf = Encoding.UTF8.GetBytes(msg); 
       clientSock.SendTo(buf, servEP); 
      } 
     } 
    } 


    static void Main(string[] args) 
    { 

     ChatClient client = new ChatClient(); 
     client.SendThread(); 
     client.ReceiveThread(); 
    } 
} 

감사합니다.

+0

SendTo()가 처음 인 경우에만 작동하며, 그렇지 않으면 ReceiveFrom()이 처음 작동하지 않을 때 작동한다는 것을 알게되었습니다. 누군가가 왜 이렇게 작동하는지 설명 할 수 있습니까? –

답변

2

분명히 SendTo()는 암시 적 바인딩을 수행하고 ReceiveFrom()은 그렇지 않습니다.

수신하는 포트 번호를 적어도 설정하려면 이전 바인딩없이 수신을 시작하는 것이 좋습니다. 그렇지 않으면 어떤 데이터를 얻을 것으로 예상됩니까?

+0

감사합니다. SendTo()가 암시 적 바인드를한다는 것을 알지 못했습니다. 이제는 의미가 있습니다. :) –