C# 如何在单个阵列中的单个套接字上使用UDP接收多个数据包

C# 如何在单个阵列中的单个套接字上使用UDP接收多个数据包,c#,C#,我需要接收多个数据包,但我只收到一个数据包,我希望下一个数据包的值应该覆盖同一数组中上一个数据包的值 例如,我的代码示例是: 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.Ne

我需要接收多个数据包,但我只收到一个数据包,我希望下一个数据包的值应该覆盖同一数组中上一个数据包的值

例如,我的代码示例是:

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();
}
使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用系统图;
使用System.IO;
使用System.Linq;
Net系统;
使用System.Net.Sockets;
使用系统文本;
使用System.Text.RegularExpressions;
使用系统线程;
使用System.Windows.Forms;
使用microLCC;
命名空间A2LDFCSolver
{
公共部分类Form1:Form
{
int m;
字节[]数据=新字节[1024];
//字节[]缓冲区=新字节[10];
IPEndPoint端点=新IPEndPoint(IPAddress.Loopback,1235);
Socket newsocket=新套接字(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
IPEndPoint sen=新的IPEndPoint(IPAddress.Loopback,5001);
microLCC.microLCC uLC=新的microLCC.microLCC();
终点tmp;
StateObject obj=新的StateObject();
整数计数=0;
int cout=0;
public static ManualResetEvent allDone=新的ManualResetEvent(false);
公共表格1()
{
初始化组件();
绑定(端点);
tmp=(终点)sen;
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
backgroundWorker1.RunWorkerAsync();
}
私有void bw_重置(对象发送方,RunWorkerCompletedEventArgs e)
{
}
私有void bw_ProgressChanged(对象发送方,ProgressChangedEventArgs e)
{
textBox1.Text=“Message Received”+count.ToString();
}
私有void bw_doit(对象发送方,DoWorkEventArgs e)
{ 
StateObject状态=新的StateObject();
while(true)
{
全部完成。重置();
//newsocket.ReceiveFrom(数据,0,40,SocketFlags.None,参考tmp);
BeginReceive(数据,0,40,0,新异步回调(ReadCallback),状态);
backgroundWorker1.报告进度(0);
全部完成。WaitOne();
}
}
受保护的void ReadCallback(IAsyncResult ar)
{
allDone.Set();
StateObject状态=(StateObject)ar.AsyncState;
套接字处理程序=state.workSocket;
//Socket newsocket=(Socket)ar.AsyncState;
//newsocket.EndReceive(ar);
计数=计数+1;
对于(m=0;m
IPEndPoint sen=new-IPEndPoint(IPAddress.Loopback,5001);
终点tmp=(终点)sen;
绑定(端点);
整数计数=0;

虽然(newsocket.Available>0&&count感谢您的帮助,这是可行的,但实际上根据我的要求,我需要第二个数据包的值应该出现在数组的开头。例如,我只需要得到17个值,这些值可以从数组的第一位存储到数组的第17位,如果我得到另一个数据包,它应该结束写入数组的上一个值,并且应从数组的第一个位置开始…@user1465977:-newsocket.ReceiveFrom(数据,0,40,…)然后声明一个arraylist并继续向其中添加传入的数据包。@Anon ymous:-再次感谢您,请您通过编写一个代码告诉我如何才能做到这一点。.大家好,我的问题是我想从客户端接收多个数据包,但我只收到一个数据包。这是我的代码示例。.如果有人有任何信息,我该怎么做关于它,请在这方面帮助我。这是我的代码示例。。
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);
}