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;mIPEndPoint 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);
}