c语言编程笔录

首页 >   > 笔记大全

笔记大全

C怎么使用udp实现消息的接收和发送

更新时间:2023-10-17

使用UDP进行消息发送和接收

UDP是无连接的,不保证数据可靠性和完整性,但具有高效,不阻塞等优点。使用C#语言实现UDP数据包传输,主要包括三个部分:创建socket连接,发送数据,接收数据。

创建Socket连接

在使用UDP协议进行数据传输之前,需要先创建UDP socket连接。

private Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

其中AddressFamily.InterNetwork表示使用IPv4协议,SocketType.Dgram表示使用UDP协议,ProtocolType.Udp也表示使用UDP协议。

发送数据

创建连接之后,就可以发送数据了。需要将数据转换为字节流,并指定发送的目的地。在C#中,可以使用EndPoint表示目的地址。

private void SendData(byte[] data, string ipAddress, int port)
{
    IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(ipAddress), port);
    socket.SendTo(data, endPoint);
}

其中data是要发送的数据,ipAddress是目的地址,port是目的端口号。

接收数据

接收数据需要使用另外一个线程,不断监听数据的到来。C#中可以使用BeginReceiveFrom和EndReceiveFrom方法实现。

private void StartListening()
{
    IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 0);
    EndPoint remoteEndPoint = endPoint;
    byte[] buffer = new byte[1024];
    socket.Bind(endPoint);
    socket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref remoteEndPoint, new AsyncCallback(ReceiveData), buffer);
}

private void ReceiveData(IAsyncResult result)
{
    EndPoint endPoint = new IPEndPoint(IPAddress.Any, 0);
    EndPoint remoteEndPoint = endPoint;
    byte[] buffer = (byte[])result.AsyncState;
    int receivedSize = socket.EndReceiveFrom(result, ref remoteEndPoint);
    socket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref remoteEndPoint, new AsyncCallback(ReceiveData), buffer);
}

其中StartListening方法会在启动时调用,使用Bind方法绑定端口号和IP地址。ReceiveData方法会在收到数据时被调用,EndReceiveFrom会返回接收到数据的长度,可以通过remoteEndPoint确定数据来自哪个地址。

总结:

本文介绍了C#如何使用UDP进行消息的接收和发送,需要通过创建socket连接,发送数据和接收数据三个步骤实现。

首先,需要创建socket连接,使用AddressFamily.InterNetwork表示使用IPv4协议,SocketType.Dgram表示使用UDP协议,ProtocolType.Udp也表示使用UDP协议。

其次,需要发送数据,将数据转换为字节流,并通过EndPoint指定目的地址,使用SendTo方法实现。

最后,需要接收数据,使用BeginReceiveFrom和EndReceiveFrom方法实现。接收数据需要使用另外一个线程,不断监听数据到达。

UDP虽然无连接,不保证数据可靠性和完整性,但具有高效、不阻塞等优点。在不需要接收应答、数据传输量大、数据要求实时等情况下,可以使用UDP。