2012-08-08 5 views
0

여러 패킷을 수신해야하지만 하나의 패킷 만 가져오고 다음 패킷의 값이 이전 패킷의 값을 덮어 쓰길 원합니다 배열단일 배열의 단일 소켓에서 UDP를 사용하여 여러 패킷을 수신하는 방법

예를 들어 내 코드의 샘플입니다 : 내가 어떻게 그 하나의 배열에 하나 개 이상의 패킷을 수신해야하는 경우 여기

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.IO; 
using System.Linq; 
using System.Net; 
using System.Net.Sockets; 
using System.Text; 
using System.Text.RegularExpressions; 
using System.Threading; 
using System.Windows.Forms; 

using microLCC; 

namespace A2LDFCSolver 
{ 
    public partial class Form1 : Form 
    { 
    int m; 
    byte[] data = new byte[1024]; 
    //byte[] buffer = new byte[10]; 
    IPEndPoint endpoint = new IPEndPoint(IPAddress.Loopback, 1235); 
    Socket newsocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
    IPEndPoint sen = new IPEndPoint(IPAddress.Loopback, 5001); 
    microLCC.microLCC uLC = new microLCC.microLCC(); 
    EndPoint tmp; 
    StateObject obj = new StateObject(); 
    int count = 0; 
    int cout = 0; 

    public static ManualResetEvent allDone = new ManualResetEvent(false); 

    public Form1() 
    { 
     InitializeComponent(); 
     newsocket.Bind(endpoint); 
     tmp = (EndPoint)sen; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     backgroundWorker1.RunWorkerAsync(); 
    } 

    private void bw_Reset(object sender, RunWorkerCompletedEventArgs e) 
    { 

    } 

    private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     textBox1.Text = "Message Recieved" + count.ToString(); 
    } 

    private void bw_doit(object sender, DoWorkEventArgs e) 
    { 
     StateObject state = new StateObject(); 
     while (true) 
     { 
      allDone.Reset(); 
      //newsocket.ReceiveFrom(data, 0, 40, SocketFlags.None, ref tmp); 
      newsocket.BeginReceive(data, 0, 40, 0, new AsyncCallback(ReadCallback), state); 
      backgroundWorker1.ReportProgress(0); 
      allDone.WaitOne(); 
     } 
    } 

    protected void ReadCallback(IAsyncResult ar) 
    { 
     allDone.Set(); 
     StateObject state = (StateObject)ar.AsyncState; 
     Socket handler = state.workSocket; 
     //Socket newsocket = (Socket)ar.AsyncState; 
     //newsocket.EndReceive(ar); 
     count = count + 1; 
     for (m = 0; m <= 17; m = m + 1) 
     { 
      if (m <= 7) 
      { 
       uLC.setDAC_raw(m, data[m]); 
      } 
      if (m >= 8 && m <= 14) 
      { 
       if (data[m] == 1) 
       { 
        uLC.setRelay((m - 7), true); 
       } 
       if (data[m] == 0) 
       { 
        uLC.setRelay((m - 7), false); 
       } 
      } 
      if (m == 15) 
      { 
       uLC.setEPM_CaS(data[m]); 
      } 
      if (m == 16) 
      { 
       uLC.setEPM_CrS(data[m]); 
      } 
     } 
     send(newsocket); 
    } 

    private void send(Socket newsocket) 
    { 
     StateObject state = new StateObject(); 
     byte[] buffer = new byte[1024]; 

     for (int i = 0; i < 6; i++) 
     { 
      buffer[i] = (Byte)uLC.getADC(i); 

     } 
     newsocket.BeginSendTo(buffer, 0, 7, 0, sen,new AsyncCallback(SendCallback), state); 
    } 

    protected void SendCallback(IAsyncResult ar) 
    { 
     try 
     { 
      StateObject state = (StateObject)ar.AsyncState; 
      Socket handler = state.workSocket; 
      int s = newsocket.EndSendTo(ar); 
     } 
     catch (Exception err) 
     { 
      MessageBox.Show(err.ToString()); 
     } 
    } 
} 


public class StateObject 
{ 
    public Socket workSocket = null; 
    public const int BufferSize = 1024; 
    public StringBuilder sb = new StringBuilder(); 
} 

내가 내 데이터 배열의 값을 한 번만 수신 만하고 그럴 수 있니?

나에게 사전에

감사합니다 ..이 작동하고 도움을

답변

1
IPEndPoint sen = new IPEndPoint(IPAddress.Loopback, 5001);  
EndPoint tmp = (EndPoint)sen;  
newsocket.Bind(endpoint); 
int count=0; 
while(newsocket.Available>0 && count<data.Length) 
{ 
    count+= newsocket.ReceiveFrom(data,count, 40, SocketFlags.None, ref tmp); 
} 
+0

감사하지만 실제로 내 요구 사항에 따라 내가 2 패킷의 값은 배열의 시작에 와야 필요를 도와주세요 .. 예를 들어, 배열의 17 번째 장소까지 배열의 첫 번째 장소에서 저장할 수있는 유일한 17 값을 얻을 필요가 만약 내가 다른 패킷을 얻을 배열의 이전 값을 덮어 씁니다 및 시작해야합니다 배열의 첫번째 장소 .... – user1465977

+0

@ user1465977 : - newsocket.ReceiveFrom (data, 0, 40, ..) arraylist를 선언하고 계속 추가한다. 수신 패킷. – perilbrain

+0

@ Anon ymous : - 다시 한 번 감사드립니다. 코드를 작성하면 어떻게 할 수 있습니까? – user1465977

관련 문제