2012-11-01 2 views
0
을 저장 멀티 캐스트에서

안녕하세요 저는 패킷을받을 때C#을 IP 수신하고 여러 개의 패킷

Socket sock = new Socket(AddressFamily.InterNetwork, 
      SocketType.Dgram, ProtocolType.Udp); 
Console.WriteLine("Ready to receive…"); 
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050); 
EndPoint ep = (EndPoint)iep; 
sock.Bind(iep); 
sock.SetSocketOption(SocketOptionLevel.IP, 
      SocketOptionName.AddMembership, 
      new MulticastOption(IPAddress.Parse("224.100.0.1"))); 
byte[] data = new byte[1024]; 
int recv = sock.ReceiveFrom(data, ref ep); 
string stringData = Encoding.ASCII.GetString(data, 0, recv); 
Console.WriteLine("received: {0} from: {1}", stringData, ep.ToString()); 
sock.Close(); 

지금이 작동하는 멀티 캐스트 주소에 데이터를 수신 할 수 here에서이 코드는 다음 sock.ReceiveFrom가 트리거하지만 이후 있어요 수신기가 종료됩니다 (sock.Close 라인을 제거하더라도).
내가 원하는 것은 수신자가 데이터를 표시하거나 저장하지만 더 많은 패킷을 계속 수신한다는 것입니다.

이 작업을 수행하는 좋은 방법은 무엇입니까?

답변

1

어떤 종류의 루프를 코딩하거나 BeginReceive/EndReceive 비동기 메서드를 사용해야합니다. 로컬 sock 변수가 범위를 벗어나면 gc에 의해 수집되어 폐기 될 수 있습니다.

byte[] data = new byte[1024]; 

while (true) { 
    // this blocks until some bytes are received 
    int recv = sock.ReceiveFrom(data, ref ep); 
    string stringData = Encoding.ASCII.GetString(data, 0, recv); 
    Console.WriteLine("received: {0} from: {1}", stringData, ep.ToString()); 
} 
+0

while 루프를 사용할 때 자체 스레드에서 실행한다고 가정하면 BeginReceive 메서드를 사용하는 것이 더 좋을까요? – Gobliins

+0

컨텍스트에 따라 다릅니다. 수신은 차단 작업입니다. 그 동안 다른 일을해야 할 때 스레드를 확장하고 blocking while 루프를 사용하거나'BeginReceive/EndReceipt'를 사용하여 비동기 프로그래밍 모델을 사용하십시오. – Jan

관련 문제