2012-09-20 2 views
1

LAN을 통해 UDP를 사용하려고합니다. 여기에서 볼 수 있듯이 하나의 PC로 다른 하나의 패키지를 보내지 만, 여전히 목록을 작성하는 동안 패킷을 보낼 수 있습니까? 프로세스가 응답을 멈추는 것을 받기 시작합니다. 이것이 스레드와 관련이 있다는 것을 알고 있지만 약간의 도움이 필요합니다. 감사합니다. 미리 감사드립니다.UDP는 항상 백그라운드에서 LAN을 통해 수신합니다.

UdpClient client = new UdpClient(); 

public void SendPacket() 
{ 
    byte[] packet = Encoding.ASCII.GetBytes(DateTime.Now.ToString("HH:mm:ss:ff")); 
    client.Send(packet, packet.Length, tbIP.Text, 444); 
    dgvSend.Rows.Add(DateTime.Now.ToString("HH:mm:ss:ff")); 
} 

public void ReceivePacket() 
{ 
    client = new UdpClient(444); 
    IPEndPoint server = new IPEndPoint(IPAddress.Any, 0); 
    byte[] packet = client.Receive(ref server); 
    dgvReceiv.Rows.Add(Encoding.ASCII.GetString(packet), DateTime.Now.ToString("HH:mm:ss:ff")); 
} 

답변

1

하는 즉시 Receive 뭔가 다른 사람으로부터 무엇인가를 받기 위해 다른 Receive를 시작해야한다.

일반적으로 여러 개의 연결을 수신하려는 경우 비동기 IO를 사용합니다. 당신이 (http://msdn.microsoft.com/en-us/library/system.net.sockets.udpclient.beginreceive.aspx에서) 익명 메소드를 사용하지 않는 뭔가 더 편안 있다면

var client = new UdpClient(endPoint); 
AsyncCallback callback = null; 
callback = ar => 
      { 
      IPEndPoint newIncomingEndPoint = endPoint; 
      byte[] data = client.EndReceive(ar, ref newIncomingEndPoint); 
      client.BeginReceive(callback, null); 
         // TODO: do something with data 
      }; 
client.BeginReceive(callback, null); 

이 아니면 : 예를 들어 당신이 IO 비동기 사용하지 않는 경우

public static bool messageReceived = false; 

public static void ReceiveCallback(IAsyncResult ar) 
{ 
    UdpClient u = (UdpClient)((UdpState)(ar.AsyncState)).u; 
    IPEndPoint e = (IPEndPoint)((UdpState)(ar.AsyncState)).e; 

    Byte[] receiveBytes = u.EndReceive(ar, ref e); 
    string receiveString = Encoding.ASCII.GetString(receiveBytes); 

    Console.WriteLine("Received: {0}", receiveString); 
    messageReceived = true; 
} 

public static void ReceiveMessages() 
{ 
    // Receive a message and write it to the console. 
    IPEndPoint e = new IPEndPoint(IPAddress.Any, listenPort); 
    UdpClient u = new UdpClient(e); 

    UdpState s = new UdpState(); 
    s.e = e; 
    s.u = u; 

    Console.WriteLine("listening for messages"); 
    u.BeginReceive(new AsyncCallback(ReceiveCallback), s); 

    // Do some work while we wait for a message. For this example, 
    // we'll just sleep 
    while (!messageReceived) 
    { 
    Thread.Sleep(100); 
    } 
} 

당신은 '수 기존 Receive을 처리하는 동안 다른 연결을받지 못합니다. 따라서 연결하려는 무언가가 거절 될 수있는 시간적 차이가 있습니다.

+0

안녕하세요, 이전에이 코드를 보았습니다.하지만 보내기 위해 뭔가를 받으려면 기다려야하므로 아직 이해가되지 않습니다. 내 요점은 동시에 듣고 보내는 것입니다. FYI 코드가 UdpState 클래스가 없기 때문에 불완전합니다. –

+0

글쎄, 당신은 정말로 듣지 않습니다. 당신은 방금 받았습니다. 'Receive'를 사용하면 수신하기 전에 보내야합니다. BeginReceive를 사용하면 방금 누군가에게 응답을 보내는 동안 다른 수신을 시작할 수 있습니다. –

관련 문제