何时关闭UDP套接字

时间:2013-11-06 18:31:06

标签: c# sockets udp

我有一个客户端 - 服务器应用程序,它使用UDP套接字发送数据,数据只需要从客户端传送到服务器,服务器将始终具有相同的IP。唯一的要求是我必须每秒发送大约10封邮件的消息

目前我的做法如下:

public void SendData(byte[] packet)
{
    IPEndPoint end_point = new IPEndPoint(serverIP, serverPort);
    UdpClient udpChannel = new UdpClient(sourcePort);
    udpChannel.Connect(end_point);
    udpChannel.Send(packet, packet.Length);
    udpChannel.Close();
}

我遇到的问题是当我使用命令“udpChannel.Close()”时,服务器没有收听时需要2-3秒。 (我在What is the drawback if I do not invoke the UdpClient.Close() method?

中看到了同样的问题

我的问题是,如果我总是将数据包发送到相同的IP地址和端口,是否有必要连接套接字并在每次发送请求后将其关闭?

我打算使用的代码如下:

UdpClient udpChannel;

public void SendData(byte[] packet)
{
    udpChannel.Send(packet, packet.Length);
}

public void Initialize(IPAddress IP, int port)
{
    IPEndPoint end_point = new IPEndPoint(serverIP, serverPort);
    UdpClient udpChannel = new UdpClient(sourcePort);
    udpChannel.Connect(end_point);
}

public void Exit()
{
    udpChannel.Close();
}

这样做,在发送数据之前是否有必要检查“SendData”方法? 上面的代码有什么问题吗?

谢谢!

3 个答案:

答案 0 :(得分:10)

UDP是无连接的,调用udpChannel.Connect仅指定用于Send方法的默认主机端点。您不需要在发送之间关闭客户端,使其保持打开状态不会在发送之间保留任何连接或侦听器。

答案 1 :(得分:3)

每次发送请求后都不应该连接/关闭。当您开始工作时 - 您连接到套接字。你可以发送数据。当您不想发送/接收数据时,应关闭UdpClient,例如关闭Form时。

在您的情况下,您可以在关闭/发送客户端时检查udpClient != null,并且您可以使用try / catch,例如:

try
{
    udpClient.Send(sendBytes, sendBytes.Length);
}
catch (Exception exc)
{
    // handle the error
}

连接时使用try / catch,因为端口可能正忙或连接有其他问题。 看看UdpClient.SendAsync:)

答案 2 :(得分:0)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using System.Text;
using System.Net.Sockets;
using System;
using System.Net;

public class Server : MonoBehaviour
{
    //int[] ports;
    UdpClient udp; // Udp client

    private void Start()
    {
        udp = new UdpClient(1234);
        udp.BeginReceive(Receive, null);
    }

    void Send(string msg, IPEndPoint ipe)
    {
        UdpClient sC = new UdpClient(0);
        byte[] m = Encoding.Unicode.GetBytes(msg);
        sC.Send(m, msg.Length * sizeof(char), ipe);
        Debug.Log("Sending: " + msg);
        sC.Close();
    }

    void Receive(IAsyncResult ar)
    {
        IPEndPoint ipe = new IPEndPoint(IPAddress.Any, 0);
        byte[] data = udp.EndReceive(ar, ref ipe);
        string msg = Encoding.Unicode.GetString(data);
        Debug.Log("Receiving: " + msg);

        udp.BeginReceive(Receive, null);
    }
}

在Send()我使用新的UDP CLient并在每次关闭后关闭它。它更好,你可以同时发送和接收。