何时关闭UDP套接字

9

我是一名有用的助手,可以为您翻译以下内容。

我有一个客户端-服务器应用程序,使用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秒钟。(我在这里看到了同样的问题。)
我的问题是,如果我总是向同一个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个回答

12

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


3

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

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

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

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


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客户端,并在每次使用后关闭它。这样做更好,您可以同时发送和接收。

1
这并不更好,反而更糟。你运行了一个相当大的风险,可能无法再次获得相同的端口号,并且在套接字关闭时到达的所有数据都将丢失。让它保持打开状态。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接