C# 如何使用用户数据报协议(UDP)发送帧

C# 如何使用用户数据报协议(UDP)发送帧,c#,C#,我有一个设备,我需要使用C#通过主机与之通信,并通过以太网电缆在设备和主机之间交换帧。该设备有一个可以连接的端口和ip。以下是发送方和接收方之间帧通信的示例代码。 我对C#知之甚少,我想获得一些关于如何使用UDP协议套件建立以下通信的帮助。谢谢 //Grab the data of the device private byte[] Fetch_FrameID(bool bHostToDevice) //true:Host to Device false: Device to Ho

我有一个设备,我需要使用C#通过主机与之通信,并通过以太网电缆在设备和主机之间交换帧。该设备有一个可以连接的端口和ip。以下是发送方和接收方之间帧通信的示例代码。 我对C#知之甚少,我想获得一些关于如何使用UDP协议套件建立以下通信的帮助。谢谢

//Grab the data of the device
    private byte[] Fetch_FrameID(bool bHostToDevice)    //true:Host to Device false: Device to Host
    {
        return bHostToDevice ? new byte[] { 0x8F, 0xE1 } : new byte[] { 0x2D, 0x7A };
    }

    //Grab the Frame Sequence Number
    private byte[] Fetch_FrameSequenceNumber(int iNumber)
    {
        return new byte[] { (byte)(iNumber & 0xFF), (byte)((iNumber >> 8) & 0xFF) };
    }

    //Grab the device status
    private byte[] Fetch_HostToDeviceCommand(int iStatus)   //status:0:Active 1:Sync 2:Request
    {
        switch (iStatus)
        {
            case 0: return new byte[] { 0x00, 0x00 };     //Active
            case 1: return new byte[] { 0x11, 0x00 };     //Sync
            case 2: return new byte[] { 0x21, 0x00 };     //Request 
            default: return null;
        }
    }

    //Fetch Data Length
    private byte[] Fetch_DataLen(byte[] dataArray)
    {
        int iLength = dataArray == null ? 0 : dataArray.Length;
        return new byte[] { (byte)(iLength & 0xFF), (byte)((iLength >> 8) & 0xFF) };
    }

    //Fetch Data Check  Sum
    private byte[] Fetch_DataCheckSum(byte[] dataArray)
    {
        int iSum = 0;
        if (dataArray != null)
        {
            for (int i = 0; i < dataArray.Length; i++)
            {
                iSum += (int)dataArray[i];
            }
        }
        iSum += Convert.ToInt32("0xAA55", 16);
        return new byte[] { (byte)(iSum & 0xFF), (byte)((iSum >> 8) & 0xFF) };
    }


    private byte[] Fetc_SendHeaderInfo(int iStatus, int iNumber, byte[] dataArray)  //status:0:Active 1:Sync 2:Request
    {
        List<byte> result = new List<byte>();//TOTAL 12Bytes, each 2bytes
        result.AddRange(Fetch_FrameID(true));//Grab FrameID
        result.AddRange(Fetch_FrameSequenceNumber(iNumber));//Grab the FSN
        result.AddRange(Fetch_HostToDeviceCommand(iStatus));//Grab host to device command
        result.AddRange(Fetch_DataLen(dataArray));//Grab the data Length
        result.AddRange(Fetch_DataCheckSum(dataArray)); //Grab the data Check sum
        result.AddRange(Fetch_DataCheckSum(result.ToArray())); //Grab the headdata Check sum
        return result.ToArray();
    }
//获取设备的数据
私有字节[]Fetch_FrameID(bool bHostToDevice)//true:主机到设备false:设备到主机
{
返回bHostToDevice?新字节[]{0x8F,0xE1}:新字节[]{0x2D,0x7A};
}
//抓取帧序列号
私有字节[]获取\u帧序列号(int iNumber)
{
返回新字节[]{(字节)(iNumber&0xFF),(字节)(iNumber>>8)&0xFF)};
}
//获取设备状态
私有字节[]Fetch_HostToDeviceCommand(int-iStatus)//状态:0:活动1:同步2:请求
{
开关(iStatus)
{
案例0:返回新字节[]{0x00,0x00};//活动
案例1:返回新字节[]{0x11,0x00};//同步
案例2:返回新字节[]{0x21,0x00};//请求
默认值:返回null;
}
}
//获取数据长度
专用字节[]获取\ U数据长度(字节[]数据数组)
{
int-ILENGHT=dataArray==null?0:dataArray.Length;
返回新字节[]{(字节)(iLength&0xFF),(字节)(iLength>>8)&0xFF)};
}
//获取数据校验和
专用字节[]获取_数据校验和(字节[]数据数组)
{
int iSum=0;
if(dataArray!=null)
{
for(int i=0;i>8)&0xFF)};
}
私有字节[]Fetc_SendHeaderInfo(int-iStatus,int-iNumber,byte[]dataArray)//状态:0:活动1:同步2:请求
{
List result=new List();//总共12字节,每个2字节
result.AddRange(Fetch_FrameID(true));//抓取FrameID
result.AddRange(Fetch_FrameSequenceNumber(iNumber));//获取FSN
result.AddRange(Fetch_HostToDeviceCommand(iStatus));//抓取主机到设备命令
result.AddRange(Fetch_DataLen(dataArray));//获取数据长度
result.AddRange(Fetch_DataCheckSum(dataArray));//获取数据校验和
result.AddRange(Fetch_DataCheckSum(result.ToArray());//获取headdata校验和
返回result.ToArray();
}

UDP和TCP是不同的协议,为了使用.NET C发送UDP数据包,我建议使用
UdpClient
,如果有帮助,下面是一个发送的示例代码:

UdpClient udpClient = new UdpClient(ip, port);

try{
    udpClient.Send(bytesToSend, bytesToSendLength);
}
catch ( Exception e ){
    Console.WriteLine( e.ToString());
}
至于接收,您可以使用
UdpClient.Receive


以下是有关MSDN的文档(&p)

UDP和TCP相似但不相同。TCP是可靠的,这意味着每个消息都被确认,而UDP不确认。UDP还有TCP没有的多播模式。建立连接时,两端需要使用相同的模式。不能混合模式。“UDP作为TCP/IP的一部分”这是不对的。您可以选择UDP或TCP。相互排斥。没有听说过“UDP over TCP”。在我的例子中,我想使用UDP协议。怎么样?谢谢上面的更正